В порядке,
Я все знаю array_pop()
, но это удаляет последний элемент. Каков наилучший способ получить последний элемент массива, не удаляя его?
РЕДАКТИРОВАТЬ: Вот бонус:
$array = array('a' => 'a', 'b' => 'b', 'c' => 'c');
или даже
$array = array('a', 'b', 'c', 'd');
unset($array[2]);
echo $array[sizeof($array) - 1]; // Output: PHP Notice: Undefined offset: 2 in - on line 4
Ответы:
Многочисленные ответы в этой теме предоставляют нам много разных вариантов. Чтобы иметь возможность выбирать из них, мне нужно было понять их поведение и производительность. В этом ответе я поделюсь своими выводами с вами, сравнивались с версиями PHP
5.6.38
,7.2.10
и7.3.0RC1
( ожидается 13 декабря 2018 ).Параметры, которые
<<option code>>
я буду тестировать:$x = array_values(array_slice($array, -1))[0];
( Как это было предложено на rolacja )$x = array_slice($array, -1)[0];
( Как это было предложено на Stoutie )$x = array_pop((array_slice($array, -1)));
( Как это было предложено на rolacja )$x = array_pop((array_slice($array, -1, 1)));
( Как это было предложено на Westy92 )$x = end($array); reset($array);
( Как это было предложено на Iznogood )$x = end((array_values($array)));
( Как это было предложено на TecBrat )$x = $array[count($array)-1];
( Как это было предложено на Мирко Pagliai )$keys = array_keys($array); $x = $array[$keys[count($keys)-1]];
( Как это было предложено на thrau )$x = $array[] = array_pop($array);
( как предложено пользователем 2782001 )$x = $array[array_key_last($array)];
( как это было предложено на клоне Квазимодо , доступны в PHP 7.3)(упомянутые функции: array_key_last , array_keys , array_pop , array_slice , array_values , count , end , reset )
Тестовые входы
<<input code>>
объединяются с:$array = null;
$array = [];
$array = ["a","b","c",null];
$array = ["a","b","c","d"];
$array = []; $array[1] = "a"; $array[2] = "b"; $array[0] = "c";
$array = []; for($i=0;$i<100;$i++) { $array[] = $i; }
$array = []; for($i=0;$i<100000;$i++) { $array[] = $i; }
Для тестирования я буду использовать Docker-контейнеры
5.6.38
,7.2.10
и7.3.0RC1
PHP, такие как:Каждая комбинация из перечисленных выше
<<option code>>
s и<<input code>>
s будет работать на всех версиях PHP. Для каждого запуска теста используется следующий фрагмент кода:Для каждого запуска это будет var_dump последнего полученного последнего значения входных данных теста и выводит среднюю продолжительность одной итерации в фемтосекундах (0,000000000000001-й секунды).
Результаты приведены ниже:
Вышеупомянутые коды F atal, W arning и N otice переводятся как:
На основании этого вывода я делаю следующие выводы:
$x = end((array_values($array)));
$keys = array_keys($array); $x = $array[$keys[count($keys)-1]];
$x = end($array); reset($array);
$x = $array[count($array)-1];
$x = $array[] = array_pop($array);
$x = $array[array_key_last($array)];
(начиная с PHP 7.3)$x = $array[count($array)-1];
(из-за использованияcount
)$x = $array[] = array_pop($array);
(из-за присвоения значения потерянному оригинальному ключу)$x = end($array); reset($array);
$x = end((array_values($array)));
array_key_last
функция, по-видимому, не имеет ни одного из вышеупомянутых ограничений, за исключением того, что на момент написания этой статьи она все еще оставалась RC (поэтому используйте RC или дождитесь его выпуска в декабре 2018 года):$x = $array[array_key_last($array)];
(начиная с PHP 7.3)Немного в зависимости от того, используете ли массив как стек или как очередь, вы можете внести изменения в опцию 9.
источник
$array[array_key_last($array)];
к вашему эталону. И, пожалуйста, дайте мне уведомление, когда закончите. Я хотел бы видеть результаты производительности в сравнении.Пытаться
Чтобы сбросить его (спасибо @hopeseekr):
Ссылка на руководство
@ Дэвид Мердок добавил:
$myLastElement = end(array_values($yourArray));// and now you don't need to call reset().
На E_STRICT это выдает предупреждениеСпасибо о_О Тынк и всем!
источник
$myLastElement = end(array_values($yourArray));
и теперь вам не нужно звонитьreset()
.end(array_values())
даст E_STRICT: «Только переменные должны быть переданы по ссылке»end((array_values($yourArray)))
Коротко и сладко.
Я пришел к решению, чтобы удалить сообщение об ошибке и сохранить однострочную форму и эффективную производительность:
- предыдущее решение
Примечание: дополнительные скобки необходимы, чтобы избежать а
PHP Strict standards: Only variables should be passed by reference
.источник
$array = array_slice($array, -1); $lastEl = array_pop($array);
лично я думаю, что это лучше (без «ошибки» синтаксического анализатора)array_size() > 1
2. проверить, является ли массив на самом деле массивом. Я все еще придерживаюсь ответа @Iznogood, поскольку встроеннаяend()
функция PHP уже выполняет всю тяжелую работу более эффективным образом.Что не так с
array_slice($array, -1)
? (См. Руководство: http://us1.php.net/array_slice )array_slice()
возвращает массив. Вероятно, не то, что вы ищете. Вы хотите элемент.источник
array_slice($array, -1)[0]
чтобы получить элемент.reset(array_slice($array, -1))
другой подход (который не вызовет ошибку, еслиarray_slice()
вернет что-либо «меньше», чем одноэлементный массив)array_slice($array, -1)[0] = "";
Один из способов избежать ошибок передачи по ссылке (например, "end (array_values ($ foo))") - это использовать call_user_func или call_user_func_array:
источник
end((array_values($yourArray)))
call_user_func
хитрость не работает в PHP 7. Я думаю, что вы застряли с созданием временной переменной.Если вам не нужно изменять внутренний указатель (поддерживает как индексированные, так и ассоциативные массивы):
Если вам нужна служебная функция, которая не изменяет внутренний указатель (потому что массив передается по значению, а функция работает с его копией):
Обратите внимание, что PHP создает копии «на лету», т.е. только тогда, когда это действительно необходимо.
end()
Сам изменяет массив, поэтому внутренне копия массива генерируется.Таким образом, следующая альтернатива на самом деле быстрее, поскольку внутренне она не копирует массив, а просто создает фрагмент:
Этот «foreach / return» является твиком для эффективного получения первого (и здесь единственного) элемента.
Наконец, самая быстрая альтернатива, но только для индексированных массивов:
Для записи, вот еще один мой ответ , для первого элемента массива.
источник
array_last
функции. Для первого вы заявляете, что$array
скопировано, а для второго, что оно не копируется. В чем разница / почему она копируется в первой реализации, а не во второй?не проверено: не будет ли это работать?
Поскольку массив, возвращаемый array_values, является мимолетным, никому нет дела, если его указатель сброшен.
и если вам нужен ключ, чтобы пойти с ним, я думаю, вы бы сделали:
источник
Мне нужно это довольно часто, чтобы иметь дело со стеками, и я всегда нахожу себя сбитым с толку, что нет нативной функции, которая делает это без манипулирования массивом или его внутренним указателем в какой-либо форме.
Поэтому я обычно ношу с собой функцию util, которую также безопасно использовать в ассоциативных массивах.
источник
Чтобы получить последний элемент массива, используйте:
эталонный тест
Я перебрал 1000 раз, взяв последний элемент из маленьких и больших массивов, которые содержали 100 и 50000 элементов соответственно.
Я использовал PHP версии 5.5.32.
источник
end () предоставит последний элемент массива
источник
Начиная с версии PHP 7.3 функции
array_key_first
иarray_key_last
были введены.Поскольку массивы в PHP - это не строгие типы массивов, то есть коллекции фиксированного размера с полями фиксированного размера, начиная с индекса 0, а динамически расширенный ассоциативный массив, обработка позиций с неизвестными ключами трудна, и обходные пути не очень хороши. В противоположность этому, реальные массивы будут быстро обрабатываться через арифметику указателей, и последний индекс уже известен во время компиляции по объявлению.
По крайней мере, проблема с первой и последней позицией теперь решается встроенными функциями начиная с версии 7.3. Это даже работает без каких-либо предупреждений о литералах массива из коробки:
Очевидно, что последнее значение :
источник
В указатели $ array не вносятся изменения. Это позволяет избежать
что может быть нежелательно в определенных условиях.
источник
Для меня:
С ассоциациями:
источник
Лучшие ответы хороши, но, как упоминали @ paul-van-leeuwen и @ quasimodos-clone, PHP 7.3 представит две новые функции для непосредственного решения этой проблемы - array_key_first () и array_key_last () .
Вы можете начать использовать этот синтаксис сегодня со следующими функциями polyfill (или shim).
Предостережение: для этого требуется PHP 5.4 или выше.
источник
Чтобы сделать это и избежать E_STRICT и не связываться с внутренним указателем массива, вы можете использовать:
Элемент lelement работает только с копией, поэтому он не влияет на указатель массива.
источник
Другое решение:
источник
Еще одно возможное решение ...
источник
Как насчет:
$array == []
(возвращаетсяfalse
)источник
Вы легко получите последний элемент из массива, используя приведенную ниже логику
Не только последний элемент, но вы также можете получить второй последний, третий последний и так далее, используя логику ниже.
для второго последнего элемента вы должны передать только номер 2 в приведенном выше выражении, например:
echo ($ array [count ($ array) -2]);
источник
Для получения последнего значения из массива:
Для удаления последнего значения из массива формы:
источник
array_slice($arr,-1,1)
приведет к другому массиву длиной 1, а не к последнему элементу$a=array("red","green","blue","yellow","brown"); print_r(array_slice($a,-1,1));
Результат:Array ( [0] => brown )
Просто:
$last_element = end((array_values($array)))
Не сбрасывает массив и не выдает СТРОГО предупреждения.
PS. Поскольку ответ с наибольшим количеством голосов до сих пор не содержит двойных скобок, я отправил этот ответ.
источник
Я думаю, что это небольшое улучшение всех существующих ответов:
end()
или использование решенийarray_keys()
, особенно с большими массивамиисточник
array_values
для одноэлементного среза)Используйте функцию end ().
источник
В настоящее время я предпочел бы всегда иметь этого помощника, как предложено в ответе на php.net/end .
Это всегда будет держать указатель как есть, и нам никогда не придется беспокоиться о скобках, строгих стандартах или чем-то еще.
источник
Примечание: для (PHP 7> = 7.3.0) мы можем использовать array_key_last - получает последний ключ массива
Ссылка: http://php.net/manual/en/function.array-key-last.php
источник
Что если вы хотите получить последний элемент массива внутри цикла его массива?
Код ниже приведет к бесконечному циклу:
Решение очевидно простое для неассоциативных массивов:
источник
источник
Начиная с PHP 7.3,
array_key_last
доступноисточник
Очень просто
источник
$a = array(); $a[2] = 'c'; $a[1] = 'b'; echo end($a);
вернетсяb
мое простое решение, красивое и простое для понимания.
источник