ZaLinux.ru

Как получить последний элемент массива в PHP

Имеется много способов извлечь последний элемент массива в PHP скрипте. Они различаются своим воздействием на массив (могут удалять извлечённый элемент, либо сдвигать указатель), а также своей производительностью.

Вариант 1

Начиная с PHP 7.3 наконец-то добавлена специальная функция, которая получает последний ключ массива, это функция array_key_last.

Обратите внимание, что извлекается не последний элемент массива, а именно последний ключ, поэтому для получения самого последнего члена массива эту функцию нужно использовать следующим образом:

$x = $array[array_key_last($array)];

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

Поскольку PHP 7.3 на момент написания является совсем недавним стабильным релизом, то эта версия доступна ещё не на всех серверах. Для достижения совместимости, рекомендуется использовать следующий код:

if (! function_exists("array_key_last")) {
    function array_key_last($array) {
        if (!is_array($array) || empty($array)) {
            return NULL;
        }
        
        return array_keys($array)[count($array)-1];
    }
}

Этот код проверяет, доступна ли функция array_key_last. Если эта функция недоступна, то создаётся пользовательская функция с таким же именем, которая выполняет это же самое действие. Результатом этого будет то, что на PHP версии 7.3 и более поздних будет использоваться оригинальная функция array_key_last, а на более старых версиях будет задействована пользовательская функция array_key_last.

Рассмотрим ещё варианты, которые подойдут для более старых версий PHP.

Некоторые из рассмотренных вариантов могут показаться излишне усложнёнными, но это сделано для того, чтобы убрать воздействие на массив. К примеру, нужное действие (получение последнего элемента массива) может выполнять функция array_pop, но она не используется сама по себе (хотя применяется в некоторых рассмотренных конструкциях), поскольку в результате её действия удаляется извлекаемый элемент.

Вариант 2

$x = array_values(array_slice($array, -1))[0];

Вариант 3

$x = array_slice($array, -1)[0];

Вариант 4

$x = array_pop((array_slice($array, -1)));

Вариант 5

$x = array_pop((array_slice($array, -1, 1)));

Вариант 6

$x = end($array); reset($array);

На больших массивах также работает хорошо.

Эта опция сбивает внутренний указатель массива.

Вариант 7

$x = end((array_values($array)));

В последних версиях PHP этот вариант стал очень медленным. Рекомендуется его избегать.

Этот вариант создан в надежде сохранить внутренний указатель массива (что является недостатком предыдущего варианта), но, к сожалению, на больших массивах работает сильно медленнее.

Вариант 8

$x = $array[count($array)-1];

На больших массивах также работает хорошо.

Из-за использования count рекомендуется использовать только на автоиндексируемых массивах.

Вариант 9

$keys = array_keys($array); $x = $array[$keys[count($keys)-1]];

В последних версиях PHP этот вариант стал очень медленным. Рекомендуется его избегать.

Вариант 10

$x = $array[] = array_pop($array);

На больших массивах также работает хорошо.

Из-за того, что получение значения приводит к потере оригинального ключа рекомендуется использовать только на авто индексируемых массивах.

Заключение

Все рассмотренные ограничения снимаются новой функцией array_key_last, поэтому в конечном счёте рекомендует использовать именно её.

Источник: https://stackoverflow.com/questions/3687358/whats-the-best-way-to-get-the-last-element-of-an-array-without-deleting-it. По ссылке также имеются бенчмарки запусках этих вариантов в различных условиях (различные варианты массивов), а также с некорректными данными.

Рекомендуемые статьи:

2 Комментарии

  1. Vobuxaz

    Самое классное - это, конечно, богатое форматирование

  2. Олег

    Если рассматривать версии PHP до появления функции array_key_last, то возможно лучше использовать array_slice($array, -1)[0] - вариант 3 для получения последнего элемента массива без изменения указателя массива и изменения самого массива. Варианты 4-5 идентичны.

    Минусы других вариантов: изменение указателя или изменение массива или большое выделение памяти и полный перебор массива.

    Минус работы функции count (вариант 8): ее можно использовать только если все ключи соответствуют порядковому номеру массива (начинаются с нуля), а иначе количество элементов в массиве не соответствует номеру. Эта ситуация актуальна для изменяющихся массивов, собственно, где возможно используется эта функция.

    Вариант 1 не лучший для задачи "получить последний элемент массива в PHP", т.к. выполняется большая работа при извлечении ключей, а ключи нам вообще не надо. А вот для получения ключа последнего элемента эта функция возможно единственный хороший вариант.

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *