PHP unset vs array pop?

Если я хочу, чтобы удалить последний элемент массива, я могу использовать любой из этих двух код:

  1. array_pop($array); (возвращаемое значение не используется)

  2. unset($array[count($array) -1]);

есть ли между ними какая-либо производительность или семантическая разница?

Если нет, что предпочтительнее?

9 ответов


unset не годится, если вам нужно" сделать " что-либо с удаленным значением (если вы ранее не назначили его чему-либо в другом месте), поскольку он ничего не возвращает, тогда как array_pop даст вам то, что было последним пунктом.

на unset опция, которую вы предоставили мая быть незначительно менее эффективным, так как вы подсчитываете длину массива и выполняете некоторую математику на нем, но я ожидаю, что разница, если таковая имеется, незначительна.

как говорили другие, вышесказанное верно, если Ваш массив является числовым и смежным, однако, если Ваш массив не структурирован так, все усложняется

например:

<?php
$pop = $unset = array(
  1 => "a",
  3 => "b",
  0 => "c"
);

array_pop($pop);

// array looks like this:
//  1 => "a", 3 => "b"

$count = count($unset) - 1;
unset($count);
// array looks like this because there is no item with index "2"
//  1 => "a", 3 => "b", 0 => "c"

array_pop($array) удаляет последний элемент $array.

unset($array[count($array) -1]); удаляет элемент по индексу count($array) -1. Этот элемент необязательно является последним элементом массива.

считают $array = array(0 => 'foo', 2 => 'bar', 1 => 'baz'). В этом случае $array[1] последний элемент. Код

foreach (array(0 => "foo", 2 => "bar", 1 => "baz") as $key => $value)
  echo "$key => $value\n";

печать

0 => foo
2 => bar
1 => baz

более того, элемент в индексе count($array) -1 может даже не существовать. В наборе индексов могут быть пробелы, а целочисленные индексы могут быть смешаны с строковые индексы.


возвращаемые значения разные. array_pop возвращает последний элемент, в то время как unset ничего не вернуть.

для простого удаления последнего элемента, array_pop было бы лучше, потому что вам не нужно выполнять count($array)-1, и это чище и более читаемым.


Да есть.

во-первых,unset() опция будет работать только для числовых, смежных массивов. Если Ваш массив содержит элементы, которые не являются числовыми или имеют пробелы в его числовой последовательности, то unset() вызов получит неправильное значение от count() и не удастся.

во-вторых, предполагая, что Ваш массив является числовым и смежным, все еще есть разница:

array_pop() также вернет вам значение всплывающего элемента в качестве возврата значение. unset() этого делать не будет.

поэтому, если вам нужно продолжать использовать данные, используйте array_pop().

Если вам не нужно держать значение, то нет, вероятно, не имеет значения, какой из них вы используете, я подозреваю, что array_pop() может быть быстрее (из-за того, что не нужно звонить count()), но я не проверял, и, честно говоря, если вы не делаете тысячи звонков, разница будет незначительной в любом случае.


за исключением очевидных различий в синтаксисе вызова и возвращаемое значение...

array_pop всегда всплывает то, что в прошлом.
Ваш count - 1 сбрасывает элемент по его ID-номер, который работает только так, как вы ожидаете, если все элементы постоянно численно проиндексированными.


для чего это стоит, используя бит существующего кода, который вызывается немного более 2000 раз за раз, я помещаю $whatevers[]=$whatever (значение параметра) вверху и array_pop($whatevers) внизу.

функция вызывает себя рекурсивно до 7 или 8 уровней, и (конечно) я сделал $whatevers статическим, поэтому массив рос и сжимался.

результат? Разница между этим кодом и закомментированным была неизмерима вплоть до 100ths of a второй на ноутбуке Windows 7. Он варьировался из-за других вещей, но во многих прогонах разница в средних значениях была бессмысленной.

накладные расходы на производительность array_pop () просто не стоит задумываться, и хотя unset может быть теоретически быстрее, никто никогда не сможет обнаружить разницу.


как упоминали другие-их функциональность такая же, заприте возвращаемое значение от array_pop. Тем не менее, стоит также упомянуть о возможной проблеме производительности unset метод на большом массиве из-за count() звонок.

как упоминает Освальд, также стоит отметить, что unset() будет работать только на цифровые клавиши.


Да есть разница

array_pop () также вернет удаленный элемент, например: last element и

unset () не вернет ничего


Я бы предпочел unset (), но вы вызываете count (), который может потреблять производительность.

альтернативным выбором является array_slice (array, offset, length, preserve_keys):

$array = array_slice($array, 0, -1, true);