【问题标题】:What's the most efficient way to array_pop() the last n elements in an array?array_pop() 数组中最后 n 个元素的最有效方法是什么?
【发布时间】:2014-01-26 19:35:59
【问题描述】:

弹出数组中最后 n 个元素的有效方法是什么?

这是一个:

$arr = range(1,10);
$n = 2;
$popped_array = array();
for ($i=0; $i < $n; $i++) { 
    $popped_array[] = array_pop($arr);
}
print_r($popped_array); // returns array(10,9);

有没有更有效的方法?

【问题讨论】:

  • 为什么不array_slice
  • 您可能应该将其作为答案而不是评论。
  • 反对票是怎么回事?我知道答案很简单,但这并不是说我没有展示我的作品或展示我的想法。

标签: php arrays optimization


【解决方案1】:

使用array_splice():

如果您尝试删除最后的n 元素,请使用以下函数:

function array_pop_n(array $arr, $n) {
    return array_splice($arr, 0, -$n);
}

Demo


如果您只想检索最后的n 元素,则可以使用以下函数:

function array_pop_n(array $arr, $n) {
    array_splice($arr,0,-$n);
    return $arr;
}

Demo

【讨论】:

  • 我认为 OP 想要最后两个,而不是前两个。
  • @putvande:不。 OP 想要删除 last n 元素。
  • 嗯,这是有争议的,因为 OP 说 returns array(10,9);
  • @putvande:更新了解决这两种情况的答案。 :)
【解决方案2】:

重要的是要注意,查看其他答案,array_slice 将单独保留原始数组,因此它仍将包含末尾的元素,并且 array_splice 将改变原始数组,删除开头的元素(尽管在给出的示例中,该函数创建了一个副本,因此原始数组仍将包含所有元素)。如果您想要一些真正模仿 array_pop 的东西(并且您不需要颠倒顺序,就像在您的 OP 中那样),请执行以下操作。

$arr = range(1, 10);
$n = 2;
$popped_array = array_slice($arr, -$n);
$arr = array_slice($arr, 0, -$n);
print_r($popped_array); // returns array(9,10);
print_r($arr); // returns array(1,2,3,4,5,6,7,8);

如果您需要将 $popped_array 反转,array_reverse 它,或者像原来的示例一样弹出它,它就足够有效并且更直接。

【讨论】:

    【解决方案3】:

    为什么不使用array_slice。你可以给出一个开始和一个长度,所以如果你从最后做 2,你将得到数组中的最后两项:

    $arr = range(1,10);
    $n = 2;
    $start = count($arr) - $n;
    print_r(array_slice($arr, $start, $n));
    

    【讨论】:

    • 是的,我最终接近了这个。但正如我在下面回答的那样, $start 和 $n 不是必需的。只需使用array_slice($arr,-$n)
    【解决方案4】:

    感谢 array_slice cmets。我不知道为什么没有立即想到。

    看起来(对我来说)最简单的方法是:

    $arr = range(1,10);
    $n = 2;
    $popped_array = array_slice($arr,-$n);
    print_r($popped_array); // returns array(10,9);
    

    【讨论】:

    • 这和我给你的答案一样;-)。
    • 抱歉没有看到你的。但只是评论了你的。您不需要开始部分。一样赞成你的。再次感谢。
    猜你喜欢
    • 2010-10-11
    • 2011-07-02
    • 2014-03-03
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多