将数组的第一个元素弹出而不是最后一个(翻转的array_pop)?

38

是否有一种PHP函数可以“弹出”数组的第一个元素?
array_pop()弹出最后一个元素,但我想要弹出第一个。

5个回答

71

38

快速备忘单 如果您不熟悉术语,这里是一份备忘单,其中包含替代术语的快速翻译,可能更容易记住:

* array_unshift()  -  (aka Prepend ;; InsertBefore ;; InsertAtBegin )     
* array_shift()    -  (aka UnPrepend ;; RemoveBefore  ;; RemoveFromBegin )

* array_push()     -  (aka Append ;; InsertAfter ;; InsertAtEnd )     
* array_pop()      -  (aka UnAppend ;; RemoveAfter ;; RemoveFromEnd ) 

3
虽然array_shift()肯定是解决问题的答案,但值得一提的是,在处理大型数组时(或进行多次迭代时),这可能是一个不必要缓慢的过程。array_shift()在检索第一个元素后,会重新为数组中所有数字键定位,因此曾经位于[1]的元素变为了[0],位于[10000]的元素变为[9999]。数组越大,需要重新定位的键就越多。如果对大型数组进行迭代并多次调用array_shift(),性能损失会不断累积。基准测试表明,在处理大型数组时,反转数组顺序并从末尾弹出元素通常更加便宜。
    $array = array_reverse($array);
    $value = array_pop($array);

array_pop() 显然不需要重新索引,因为它是从末尾获取,并且 array_reverse() 简单地通过从后到前复制传递给它的数组来返回一个新的数组。在需要保留 key => value 对的情况下,可以使用 array_reverse($array, true)

[编辑] 值得注意的是,反向弹出方法的缺点是内存消耗较大,而 array_shift() 则直接在原数组上操作,因此更快。


array_reverse() 真的比 array_shift() 更快吗?在复制过程中,array_reverse()仍然需要对每个元素进行遍历。节约了哪些时间呢?加上增加的内存消耗,array_reverse()不会比array_shift()更慢吗?您进行了基准测试吗?此外,我不知道 PHP 如何计算数组索引,但我认为它们不是链表(也许是?)。数组是指向内存块的指针。因此,PHP 可以实现释放第一个数组元素并将数组指向第二个元素的内存地址。但我不知道 PHP 实际上如何实现数组。 - user2607743
@BlueWater 这是别人的基准测试结果链接。http://www.evardsson.com/blog/2010/02/05/comparing-php-array_shift-to-array_pop/ 自从我上次想到PHP已经过了很长时间,但你又让我开始思考了。难道在反转数组中只需要翻转头尾值就足够了吗?我真的不确定array_reverse()在内部做了什么。但它没有重新索引返回的数组。也许你可以告诉我!如果你还没有看过这篇文章,我认为你会喜欢:https://nikic.github.io/2012/03/28/Understanding-PHPs-internal-array-implementation.html - roninpawn
谢谢提供链接。基准测试链接测试了对数组的多次遍历。但是在这个页面上没有提到多次遍历。我以为你在谈论单个弹出操作。当然,对于多个弹出操作,单个反转将产生线性时间,而移位将产生n^m时间,其中m是弹出操作的数量。 - user2607743

2

对我来说,array_slice()很好用,就像这样说:

$arr = array(1,2,3,4,5,6);
//array_slice($array,offset); where $array is the array to be sliced, and   offset is the number of array elements to be sliced
$arr2 = array_slice($arr,3);//or
$arr2 = array_slice($arr,-3);//or
$arr2 = array_slice($arr,-3,3);//return 4,5 and 6 in a new array
$arr2 = array_slice($arr,0,4);//returns 1,2,3 and 4 in a new array

为什么不直接使用array_shift(),它更有效率呢? - Sweet Chilly Philly

0

使用key()unset()

当数组的键是数字时,array_shift()会将数组键更改为从0开始。

$arr = [5 => 5, 71 => 71, 1 => 1, 8 => 8];
$first_key = key($arr);
$first_element = $arr[$first_key];  //       <-- get first element of array
echo $first_element;  // print '5'
unset($arr[$first_key]);  //                           <-- delete first element of array

https://dev59.com/pnRC5IYBdhLWcg3wOeWB#52826684 - mickmackusa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接