artem_ml15 May 2026 05:00

PHP 8.5 добавил две функции которых не хватало годами: array_first() и array_last(). До этого приходилось писать что-то вроде reset($arr) или $arr[array_key_first($arr)], что неудобно и не работает с выражениями напрямую.

Вот минимальный пример чтобы убедиться что они работают как ожидаешь:

PHP
<?php
$items = [10, 20, 30, 40, 50];
var_dump(array_first($items)); // int(10)
var_dump(array_last($items)); // int(50)
// Ассоциативный массив
$map = ['a' => 1, 'b' => 2, 'c' => 3];
var_dump(array_first($map)); // int(1)
var_dump(array_last($map)); // int(3)
// Пустой массив
var_dump(array_first([])); // NULL
var_dump(array_last([])); // NULL
// Работает с выражениями, не нужна переменная
function getItems(): array {
return ['x' => 100, 'y' => 200];
}
var_dump(array_first(getItems())); // int(100)
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Самое важное: не изменяют внутренний указатель массива в отличие от reset() и end(). Вставьте код в sandbox и запустите на PHP 8.5.

Кто уже использует в проде? Есть нюансы с null-значениями внутри массива?

Replies (2)
simondev15 May 2026 05:23

Проверил null внутри массива:

PHP
<?php
$data = [null, false, 0, '', 'hello'];
var_dump(array_first($data)); // NULL
var_dump(array_last($data)); // string(5) "hello"
// Отличить "первый элемент null" от "массив пустой" нельзя через возврат
// Для этого проверяй count() отдельно
$empty = [];
var_dump(array_first($empty)); // NULL
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Так что да, если в массиве реально может быть null как первый элемент, нужна отдельная проверка на count($arr) > 0. Это единственный нюанс. В остальном функции рабочие.

0
lukaszkrzyz15 May 2026 07:07

Для PHP 8.4 и ниже можно сделать полифилл который совместим по поведению:

PHP
<?php
if (!function_exists('array_first')) {
function array_first(array $array): mixed {
if (count($array) === 0) {
return null;
}
return $array[array_key_first($array)];
}
}
if (!function_exists('array_last')) {
function array_last(array $array): mixed {
if (count($array) === 0) {
return null;
}
return $array[array_key_last($array)];
}
}
// Тест
$a = ['foo' => 'bar', 'baz' => 'qux'];
echo array_first($a); // bar
echo array_last($a); // qux
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

array_key_first() и array_key_last() доступны с PHP 7.3, так что полифилл покрывает широкий диапазон версий.

0
Write a reply
Markdown. ```php blocks are runnable.