2010-03-08 108 views
6

我有一個數組中的文件列表,其中文件名是鍵,值是以秒爲單位的最後修改日期。他們從最舊到最新排序。是否有可能在PHP中使用array_shift()並獲取密鑰?

的文件是​​3210倒是在,然後排序利用

asort($fileNameToLastModified, SORT_NUMERIC); 

這樣,我用array_shift()得到最舊的文件。不幸的是,它似乎給了我價值,而且似乎沒有辦法獲得鑰匙。

這樣做的唯一方法就是這樣嗎?

$keys = array_keys($fileNameToLastModified); 

$oldest = array_shift($keys); 
array_shift($fileNameToLastModified); // to manually chop the first array member off too. 

......還是有內置的方法來做到這一點?

回答

13
$result = array_splice($yourArray, 0, 1); 

...應該做的伎倆。見array_splice

+0

最後我只是保持什麼我有,因爲我仍然需要做一個'array_keys()'並獲得一個數組成員。但這仍然是另一種方式,所以我會接受:) – alex 2010-03-08 01:34:23

+0

我想你的意思是'$ result = key(array_splice($ yourArray,0,1));'? – cronoklee 2018-01-18 18:34:36

0

你也可以這樣做:

<?php 

$arr = array('a' => 'first', 'b' => 'second'); 

// This is your key,value shift line 
foreach($arr as $k => $v) { break; } 

echo "Key: $k\nValue: $k"; 

這將輸出:

Key: a 
Value: first 

我不知道性能如何,所以你可能需要做一些分析,但它很可能對於大型數組來說要快於array_keys(),因爲它不需要遍歷整個事物。

+0

由於它複製了整個'$ arr',我會說它在大數組上可能會很糟糕。 – zneak 2010-03-08 03:47:35

+1

'foreach()'不應該複製數組,當然? – 2010-04-23 02:27:52

+1

如果所有主體都有「break」,它不復制數組。 – alex 2013-03-19 03:47:14

0

你可以看看key()current()each()。他們做你所要求的。

我不確定是否打算實際從數組中獲得更多的鍵/值對。所以我不會詳細說明你可能需要做什麼。

3

您可以使用each,如:

$b = array(1=>2, 3=>4, 7=>3); 
while(1) { 
    list($key,$value) = each($b); 
    if (empty($key)) 
     break; 
    echo "$key $val\n"; 
} 

迭代與each陣列將保持其最後的位置。

2

不同的方法:

list ($vlid, $selected) = each($srcData); array_shift($srcData); 

...(或只是list($key)...如果你不需要$value)。請參閱eachlist

編輯:正如@ztate在他的評論中指出的,each()函數已被棄用,所以依靠這種方法不再是一個好主意。

但我認爲類似的行爲可以通過使用新的key()功能這(未經測試)的方式加以處理:

$vlid = key($srcData); $selected = array_shift($srcData); 
+0

警告:從PHP 7.2.0開始,每個函數都被拒絕。依靠這個功能是非常不鼓勵的。 – zstate 2018-01-11 21:24:04

+0

整個PHP已被棄用。但好點:它似乎是跨版本的PHP不一致的新受害者,所以這種方法不應該被使用(即使我不相信它會使你免受其他更改)。順便說一句,我發現類似的行爲可以通過新的函數'key()','current()'和'next()'來處理。三個函數調用,而不是一個(儘管'list()'調用肯定可以避免。 – bitifet 2018-01-11 21:43:03

0

另一種可能是短暫的工作:

foreach ($array as $key => $value) break; 
unset($array[$key]); 
相關問題