What's the most efficient way to array_pop() t

2020-03-04 04:35发布

问题:

What's an efficient way to pop the last n elements in an array?

Here's one:

$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);

Is there a more efficient way?

回答1:

Use array_splice():

If you're trying to remove the last n elements, use the following function:

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

Demo


If you want to retrieve only the last n elements, then you can use the following function:

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

Demo



回答2:

Why not use array_slice. You can give a start and a length, so if you do 2 from the end you will get the last two items in the array:

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


回答3:

It's important to note, looking at the other answers, that array_slice will leave the original array alone, so it will still contain the elements at the end, and array_splice will mutate the original array, removing the elements at the beginning (though in the example given, the function creates a copy, so the original array still would contain all elements). If you want something that literally mimics array_pop (and you don't require the order to be reversed, as it is in your OP), then do the following.

$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);

If you require $popped_array to be reversed, array_reverse it, or just pop it like your original example, it's efficient enough as is and much more direct.



回答4:

Thanks for the array_slice comments. I don't know why that didn't immediately come to mind.

It looks (to me) like the easiest way is:

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