Получение последнего элемента массива: обзор методов в PHP

Раздел: Основы PHP -> Работа с массивами в PHP

Методы извлечения последнего элемента массива

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

Какое решение считается наиболее эффективным и универсальным?

Самым распространённым и производительным является использование функции end() вместе с reset(). end() перемещает внутренний указатель массива на последний элемент и возвращает его значение. Чтобы не нарушить дальнейшую работу с массивом, после получения значения указатель возвращается в начало с помощью reset().


$array = ['a', 'b', 'c', 'd'];
$last = end($array);    // $last = 'd'
reset($array);          // возвращаем указатель в начало
var_dump($last);        // string(1) "d"
string(1) "d"

Возможные проблемы:

  • Функция end() изменяет внутренний указатель массива. Если массив используется далее по коду, нужно обязательно вызвать reset().
  • Для пустого массива end() возвращает false. Следует проверять массив на пустоту перед вызовом.

Как получить последний элемент, удаляя его из массива?

Функция array_pop() извлекает и возвращает последний элемент, одновременно удаляя его из массива. Используется, когда элемент больше не нужен в исходном массиве.


$array = [10, 20, 30];
$last = array_pop($array);
var_dump($last);          // int(30)
var_dump($array);         // [10, 20]
int(30)
array(2) { [0]=> int(10) [1]=> int(20) }

Особенности:

  • Массив сокращается на один элемент, что может быть нежелательно.
  • Для пустого массива возвращается null (до PHP 8.0 возвращал false).

Как получить последний элемент, не сдвигая указатель и не изменяя массив?

Можно использовать array_slice(), создав срез из одного последнего элемента. Подходит для индексированных массивов с последовательными ключами.


$array = ['x', 'y', 'z'];
$last = array_slice($array, -1, 1)[0];
var_dump($last);          // string(1) "z"
string(1) "z"

Недостатки:

  • Создаётся новый массив, что увеличивает потребление памяти на больших данных.
  • Не работает корректно с ассоциативными массивами, если ключи нечисловые или непоследовательные.

Как получить последний элемент по индексу, если массив обычный (числовой)?

Для индексированного массива с непрерывными ключами можно использовать count():


$array = ['red', 'green', 'blue'];
$last = $array[count($array) - 1];
var_dump($last);          // string(4) "blue"
string(4) "blue"

Ограничения:

  • Не подходит для ассоциативных массивов.
  • Некорректен при наличии пропусков в числовых ключах (например, после удаления элементов).

Как получить последний элемент ассоциативного массива, не зная его ключа?

В PHP 7.3 появилась функция array_key_last(), которая возвращает ключ последнего элемента. Затем по этому ключу получаем значение.


$assoc = ['a' => 1, 'b' => 2, 'c' => 3];
$key = array_key_last($assoc);
$last = $assoc[$key];
var_dump($key);   // string(1) "c"
var_dump($last);  // int(3)
string(1) "c"
int(3)

Примечания:

  • Функция требует PHP 7.3 или новее.
  • Не изменяет внутренний указатель массива.

Как получить последний элемент с помощью цикла, если другие варианты недоступны?

Можно пройти по массиву вручную, сохраняя последнее значение. Но этот способ избыточен и не рекомендуется для простых случаев.


$array = [100, 200, 300];
$last = null;
foreach ($array as $value) {
    $last = $value;
}
var_dump($last);          // int(300)
int(300)

Недостатки:

  • Избыточное потребление ресурсов для больших массивов.
  • Необходимость дополнительной переменной.

Расширенные примеры и нестандартные ситуации

Пример 1. Получение последнего элемента многомерного массива

Для многомерного массива можно комбинировать end() и обращаться по ключу:

Пример

$multi = [
    ['name' => 'Alice', 'age' => 25],
    ['name' => 'Bob', 'age' => 30],
    ['name' => 'Charlie', 'age' => 35]
];
$lastPerson = end($multi);
reset($multi);
print_r($lastPerson);
Array
(
    [name] => Charlie
    [age] => 35
)

Пример 2. Получение последнего элемента после фильтрации

После array_filter() массив сохраняет ключи, поэтому end() работает корректно:

Пример

$numbers = [0, 1, 2, 3, 4, 5];
$even = array_filter($numbers, fn($v) => $v % 2 == 0);
$lastEven = end($even);
reset($even);
var_dump($lastEven);      // int(4)
int(4)

Пример 3. Сравнение производительности end() и array_slice()

Для больших массивов (100000 элементов) измерим время выполнения:

Пример

$bigArray = range(1, 100000);

$start = microtime(true);
$last = end($bigArray);
reset($bigArray);
$timeEnd = microtime(true) - $start;
echo "end() + reset(): $timeEnd\n";

$start = microtime(true);
$last = array_slice($bigArray, -1, 1)[0];
$timeSlice = microtime(true) - $start;
echo "array_slice(): $timeSlice\n";
end() + reset(): 0.0000021457672119141
array_slice(): 0.00012397766113281

(примерные значения, могут отличаться)

Вывод:

end() значительно быстрее, так как не создаёт копию массива.

Пример 4. Получение последнего элемента из разреженного ассоциативного массива

Пример

$sparse = [101 => 'A', 205 => 'B', 309 => 'C'];
$key = array_key_last($sparse);
$last = $sparse[$key];
var_dump($last);          // string(1) "C"
string(1) "C"

Пример 5. Использование array_pop() для поочерёдного извлечения последних элементов

Удаление с конца подходит для реализации стека:

Пример

$stack = [1, 2, 3, 4];
while (!empty($stack)) {
    $item = array_pop($stack);
    echo "$item ";
}
// Результат: 4 3 2 1
4 3 2 1

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

En
Php последний элемент массива (php)