PHP 8.5, який вийде у листопаді 2025 року, отримає функції array_first()
та array_last()
. На перший погляд, ці функції можуть здаватися не таким вже важливими (спільнота PHP вже має свої варіанти та поліфіли), але їхнє введення було давно назрілим кроком для мови PHP.
Ці функції доповнюють вже доступні методи отримання ключів масиву, представлені в PHP 7.3:
У PHP 7.3 з'явилися функції
array_key_first()
таarray_key_last()
, які дозволяють отримувати перший та останній ключі масиву. Але ми ще не маємо зручного способу для отримання перших і останніх значень масиву, що виявляється більшим викликом, ніж здається:
- Ключі масиву не завжди є цілими числами, не завжди починаються з 0 тощо.
- Вже існуючі "трюки" на кшталт
reset()
іend()
неправильно використовують "внутрішній ітератор" масиву. Крім того, вони можуть не працювати на всіх типах виразів (наприклад, масиви, що повертаються з функцій, можуть викликати попередження через аргумент за посиланням).- Використання
$array[array_key_first($array)]
є незручним.
Отже, як працюють ці функції?
Як зазначено в RFC array_first_last, ось підписи функцій та приклади різних типів масивів і сценаріїв (без посилань):
// Підписи функцій
function array_first(array $array): mixed {}
function array_last(array $array): mixed {}
// Приклади
array_first(["одиничний елемент"]); // "одиничний елемент"
array_last(["одиничний елемент"]); // "одиничний елемент"
array_first([]); // NULL
array_last([]); // NULL
array_first([1 => 'a', 0 => 'b', 3 => 'c', 2 => 'd']); // 'a'
array_last([1 => 'a', 0 => 'b', 3 => 'c', 2 => 'd']); // 'd'
$str = "hello";
array_first([$str, false]); // "hello" (без посилання)
array_last([false, $str]); // "hello" (без посилання)
Розробники PHP вже давно мали можливість отримувати перший і останній елементи масиву за допомогою фреймворків або самостійних рішень. Це питання на Stack Overflow є чудовим прикладом того, чому рідне рішення для цих функцій буде корисним як новачкам, так і досвідченим розробникам. Ось кілька способів отримати перший елемент масиву, згідно з відповідями на Stack Overflow:
// Використовуючи shift або pop
array_shift(array_values($array));
array_pop(array_reverse($array));
// Використовуючи array_key_first (PHP 7.3+)
$first_key = array_key_first($my_array);
$first_value = $my_array[$first_key];
// Використовуючи reset
// На жаль, reset() змінює ітератор масиву
reset($arr);
Просто прочитайте різноманітність рішень, і ви зрозумієте, наскільки важливою буде рідна функція для новачків, що вивчають PHP.
Laravel має корисні хелпери для отримання першого та останнього елемента масиву за допомогою хелпера Arr
:
use Illuminate\Support\Arr;
$arr = ['https://laravel-news.com'];
Arr::first($arr); // https://laravel-news.com
Метод Arr::first()
працює як майбутня функція array_first(). Laravel дозволяє передавати власне значення за замовчуванням, яке буде повернуто, якщо масив пустий, а також необов’язкову анонімну функцію, яка повинна проходити тест на істинність, якщо ви хочете налаштувати перше повернуте значення:
public static function first($array, ?callable $callback = null, $default = null)
{
if (is_null($callback)) {
if (empty($array)) {
return value($default);
}
foreach ($array as $item) {
return $item;
}
return value($default);
}
foreach ($array as $key => $value) {
if ($callback($value, $key)) {
return $value;
}
}
return value($default);
}
В основі цієї функції цикл foreach()
є стандартним способом повернення першого елемента масиву:
foreach ($array as $item) {
return $item;
}
return value($default);
Щоб отримувати останній елемент масиву, Laravel пропонує метод Arr::last()
, який також дозволяє використовувати анонімну функцію і задавати значення за замовчуванням:
public static function last($array, ?callable $callback = null, $default = null)
{
if (is_null($callback)) {
return empty($array) ? value($default) : end($array);
}
return static::first(array_reverse($array, true), $callback, $default);
}
Без наданої анонімної функції Laravel використовує функцію end()
, якщо масив не пустий. Якщо передана анонімна функція, ця реалізація перевертає масив і викликає метод Arr::first()
, фактично отримуючи останній елемент масиву за допомогою заданої функції.
Фреймворк Symfony має полифіл для функцій array_first() та array_last() з PHP 8.5:
public static function array_first(array $array)
{
foreach ($array as $value) {
return $value;
}
return null;
}
Цей метод подібний до рішення Laravel, проте як поліфіл він не дозволяє налаштовувати значення за замовчуванням — воно буде null
, як і передбачено функціями array_first()
і array_last()
.
Полифіл Symfony для array_last()
використовує функцію current()
, яка повертає значення елемента масиву, на який вказує внутрішній вказівник. Якщо масив $array
пустий, повертається null
:
public static function array_last(array $array)
{
return $array ? current(array_slice($array, -1)) : null;
}
Код пропозиції RFC вже реалізовано та об'єднано в основну гілку виходу PHP на момент написання.
Щоб дізнатися більше, ознайомтеся з повною інформацією у пропозиції RFC: rfc:array_first_last.