2010-03-08 110 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]); 
相关问题