PHP
#php#php-8-5#bitrix#array_first#array_last#getList#selection

PHP 8.5: array_first и array_last для выборок в Bitrix

Получение первого и последнего значения массива через array_first() и array_last() (PHP 8.5). Для результатов getList, массивов заказов и элементов без reset/end.

Как использовать

  1. Передайте массив в array_first($array) или array_last($array); возвращается первое/последнее значение по порядку обхода, на пустом массиве — null.
  2. Для итераторов D7/CDBResult сначала соберите массив (iterator_to_array или foreach), затем вызывайте array_first/array_last.
  3. Функции без 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.

Проверка

  1. Обычный массив — выполните в консоли или скрипте:
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».

  1. Пустой массив — array_first([]) и array_last([]) должны вернуть null без предупреждений.

  2. Ассоциативный массив — порядок обхода сохраняется (в 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, История оплат и отгрузок заказа, Список элементов с пагинацией.