PHP unset vs array pop?
Если я хочу, чтобы удалить последний элемент массива, я могу использовать любой из этих двух код:
array_pop($array);
(возвращаемое значение не используется)
есть ли между ними какая-либо производительность или семантическая разница?
Если нет, что предпочтительнее?
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);