PHP 8.5: array_first и array_last для выборок в Bitrix
Получение первого и последнего значения массива через array_first() и array_last() (PHP 8.5). Для результатов getList, массивов заказов и элементов без reset/end.
Как использовать
- Передайте массив в array_first($array) или array_last($array); возвращается первое/последнее значение по порядку обхода, на пустом массиве — null.
- Для итераторов D7/CDBResult сначала соберите массив (iterator_to_array или foreach), затем вызывайте array_first/array_last.
- Функции без callback — для поиска по условию используйте array_find() (PHP 8.4+) или цикл.
В PHP 8.5 добавлены функции array_first() и array_last(): они возвращают первое и последнее значение массива по порядку обхода. На пустом массиве возвращают null. Проблема: без них берут первый/последний элемент через reset()/end() с побочным сдвигом внутреннего указателя или через цикл/array_values()[0]. Код получается многословным и легко ошибиться с пустым массивом. Симптомы: лишний foreach, предупреждения при пустом массиве. Ниже — использование array_first/array_last для массивов и выборок в Bitrix (getList, заказы, элементы); проверка и типичные ошибки.
Решение
Получение первого и последнего значения массива через array_first() и array_last() (PHP 8.5). Удобная замена reset()/end() и лишнему foreach, когда нужен только один элемент из выборки.
<?php
$items = [10 => 'a', 0 => 'b', 3 => 'c', 2 => 'd'];
$first = array_first($items); // 'a'
$last = array_last($items); // 'd'
$empty = [];
array_first($empty); // null
array_last($empty); // null
В Bitrix после getList или цикла по итератору:
// Массив из D7-итератора
$list = [];
foreach ($iterator as $row) {
$list[] = $row;
}
$firstOrder = array_first($list);
$lastOrder = array_last($list);
// Уже имеющийся массив заказов/элементов
$orders = [...]; // выборка заказов
$newest = array_last($orders);
$oldest = array_first($orders);
Сигнатура: array_first(array $array): mixed, array_last(array $array): mixed. Callback нет — для поиска по условию используйте array_find() (PHP 8.4+) или цикл. В Bitrix при CDBResult или D7-итераторе сначала соберите массив (iterator_to_array() или foreach), затем вызывайте array_first/array_last.
Проверка
- Обычный массив — выполните в консоли или скрипте:
php -r "
\$items = [10 => 'a', 0 => 'b', 3 => 'c'];
echo array_first(\$items) . PHP_EOL;
echo array_last(\$items) . PHP_EOL;
"
Ожидаем: a и c (по порядку обхода). На PHP меньше 8.5 будет ошибка «Unknown function».
-
Пустой массив — array_first([]) и array_last([]) должны вернуть null без предупреждений.
-
Ассоциативный массив — порядок обхода сохраняется (в PHP 7+ порядок вставки). Первое значение — у первого ключа по порядку, последнее — у последнего. Проверьте на своём массиве (например результат getList с ключами ID).
Типичные ошибки
- Передача итератора вместо массива — array_first и array_last принимают только array. Для D7 getList() и т.п. сначала получите массив:
iterator_to_array($iterator)или цикл с$list[] = $row, затем array_first($list). - Ожидание callback — в PHP 8.5 у array_first/array_last нет второго аргумента с условием. Нужен «первый/последний по условию» — используйте array_find() (PHP 8.4+) или перебор с break.
- PHP меньше 8.5 — функции добавлены в 8.5. На старых версиях «Call to undefined function». Проверьте:
php -v. На старых версиях можно обойтись reset/end или array_values()[0] с проверкой на пустоту.
Где применять
- Bitrix: выборки заказов, элементов, результатов getList — когда нужен только первый или последний элемент (например «последний заказ», «первый элемент списка»).
- Любой PHP 8.5+: везде, где нужен первый/последний элемент массива без сдвига указателя и без лишнего кода.
Связанные сниппеты: Option::get с union type, История оплат и отгрузок заказа, Список элементов с пагинацией.