【问题标题】:Is it possible to use array_shift() in PHP and get the key?是否可以在 PHP 中使用 array_shift() 并获取密钥?
【发布时间】:2011-01-24 19:35:37
【问题描述】:

我有一个数组中的文件列表,其中文件名是键,值是最后修改日期(以秒为单位)。它们从最旧到最新排序。

文件是glob()'d in,然后使用这种方式排序

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.

...或者有没有内置的方法可以做到这一点?

【问题讨论】:

  • 对于那些只想要第一项的键(排序后)的人,array_keys($my_arr)[0] 可以工作(尽管对于长数组来说会很昂贵)

标签: php sorting arrays


【解决方案1】:
$result = array_splice( $yourArray, 0, 1 );

... 应该可以解决问题。见array_splice

【讨论】:

  • 我最终只保留了我所拥有的,因为这样我仍然需要做一个array_keys() 并获得一个数组成员。但这仍然是另一种方法,所以我会接受它:)
  • 我想你的意思是$result = key(array_splice( $yourArray, 0, 1 ));
【解决方案2】:

你可以使用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 迭代数组将保持其最后位置。

【讨论】:

    【解决方案3】:

    不同的方法:

    list ($key, $value) = each($srcData); array_shift($srcData);
    

    ...(如果您不需要 $value,则只需 list($key)...)。请参阅eachlist

    编辑:正如@ztate 在他的评论中指出的那样,each() 函数已被弃用,因此依赖这种方法不再是一个好主意。

    但我认为可以通过使用新的 key() 函数以这种(未经测试的)方式来处理类似的行为:

    $key = key($srcData); $selected = array_shift($srcData);
    

    【讨论】:

    • 警告:Each 函数自 PHP 7.2.0 起已弃用。强烈建议不要依赖此函数。
    • 我不推荐使用整个 PHP。但好的一点:它似乎是 PHP 版本之间通常不一致的新受害者,所以不应该使用这种方法(即使我不相信它会让你免于其他更改)。顺便说一句,我发现新函数key()current()next() 可以实现类似的行为。三个函数调用而不是一个(尽管当然可以避免 list() 调用。
    【解决方案4】:

    你也可以这样做:

    <?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() 更快,因为它不需要遍历整个事情。

    【讨论】:

    • 因为它复制了整个$arr,我想说它在大阵列上可能很糟糕。
    • foreach() 不应该复制数组,确定吗?
    • 如果正文的所有内容都是break,则不会复制数组。
    【解决方案5】:

    您可以查看key()current()each()。他们会按照你的要求去做。

    我不确定您是否打算在之后从数组中获得更多的键/值对。因此,我不会详细说明您可能还需要做什么。

    【讨论】:

      【解决方案6】:

      另一种短期工作的可能性:

      foreach ($array as $key => $value) break;
      unset($array[$key]);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-19
        • 2011-10-26
        • 1970-01-01
        • 2020-08-24
        • 1970-01-01
        • 2011-06-04
        相关资源
        最近更新 更多