【问题标题】:Pop first element of array instead of last (reversed array_pop)?弹出数组的第一个元素而不是最后一个元素(反转 array_pop)?
【发布时间】:2009-02-26 08:07:58
【问题描述】:

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

【问题讨论】:

    标签: php arrays


    【解决方案1】:

    您正在寻找 array_shift()。

    PHP Array Shift

    【讨论】:

      【解决方案2】:

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

      * 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() 通过简单地从后向前复制传递给它的数组来返回一个新数组。 array_reverse($array, true) 可用于在需要时保留 key => value 对。

        [EDIT] 我应该提一下,reverse-pop 方法的缺点是内存消耗,其中array_reverse() 生成一个新数组,而array_shift() 工作在适当的位置。因此需要更长的时间。

        【讨论】:

        • array_reverse() 真的比 array_shift() 快吗? Array_reverse() 在复制过程中仍然需要对每个元素进行传递。储蓄在哪里?而且随着内存消耗的增加,array_reverse() 不会比 array_shift() 慢吗?你有基准吗?另外,我不知道 PHP 如何计算数组索引,但我假设它们不是链表(也许它们是?)。数组是指向内存块的指针。因此,PHP 可以实现释放第一个数组元素并将数组指向第二个元素的内存地址。我不知道 PHP 是如何实现数组的。
        • @BlueWater 这是指向其他人的基准测试结果的链接。 evardsson.com/blog/2010/02/05/… 很久没有想到 PHP 了,但你让我再次思考。反转头部和尾部值是否是所有必要的反向操作?老实说,我不确定 array_reverse() 在内部做什么。但它没有重新索引它返回的数组。也许你可以告诉我!如果你还没有看过这篇文章,我想你会喜欢这篇文章的:nikic.github.io/2012/03/28/…
        • 感谢您的链接。基准链接测试阵列上的多次通过。但是此页面上没有提到多次传递。我以为你在谈论一个单一的流行音乐。当然,对于多个 pops,单个 reverse 将产生线性时间,而 shift 将产生 n^m 时间,其中 m 是 pops 的数量。
        【解决方案4】:

        对我来说 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() 会更有效?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-22
        • 2015-04-20
        • 2021-03-14
        • 1970-01-01
        • 1970-01-01
        • 2021-09-10
        • 1970-01-01
        相关资源
        最近更新 更多