TGViewer
Пых Пых @phpyh · 7.83K subscribers
Post #720 8.09K

Forwarded from The Fly's PHP - Делаем из Мухи Слона

Всем, привет! С прошлыми майскими праздниками, и с будущими тоже! 🎉

Во всех PHP сообществах наступила тишина, или все отдыхают, или усердно работают 😄
Так или иначе, под шумок апрельских и майских деньков ворвался и был одобрен RFC по добавлению новых функций для работы с массивами: array_first() и array_last() в PHP 8.5.

Как видно из названий, это функции для получения первого и последнего значения передаваемого массива. Примеры результатов:

array_first([1, 2, 3]); // 1
array_first([2, 3]); // 2
array_first(['a' => 2, 'b' => 1]); // 2
array_first([null, 2, 3]); // null
array_first([]); // null
array_first([$obj, 2, 3]); // $obj
array_first([1])); // 1
array_first([true]); // true

array_last([1, 2, 3]); // 3
array_last([2, 3]); // 3
array_last(['a' => 2, 'b' => 1]); // 1
array_last([2, 3, null]); // null
array_last([]); // null
array_last([2, 3, $obj]); // $obj
array_last([1])); // 1
array_last([true]); // true


И тут возможно возникнет вопрос? Что? Это было добавлено только что, неужели ранее подобных функций не было в PHP, языке в котором есть почти все что угодно для работы с массивами.
И действительно только что. Достаточно вспомнить, что массив в PHP - это монструозный комбайн всего, что только можно придумать. Соответственно метод "влоб" - получения элемента по нулевому индексу, не всегда даст ожидаемый результат:

$array = [
"g" => 456,
2,
4 => "string"
];

var_dump($array[0]); //выдаст 2
[$first] = $array; // какая-нибудь деструктуризация выдаст тоже 2


Заглянем в недалекое прошлое, в 2018 год, PHP 7.3, в то время были приняты такие функции как array_key_first() и array_key_last().

Но возможно для кого-то будет новостью, что в том же RFC предлагалось ввести так же такие функции как array_value_first() и array_value_last(), что логично возвращали бы значения первого и последнего элемента в массиве. Но эти функции были отклоненны, почему, не совсем понятно, может кто-то из подписчиков помнит и знает доподлинную причину отклонения, либо просто время не пришло, и нужны были дополнительные 7 лет для переосознания 😀

Так вот с тех пор получать ключи стало проще, нежели ранешнее array_keys($array)[0], а если еще массив был пустым, то обязательная проверка на пустоту или вообще увеличение когнитивной сложности реализации в виде циклов (что-то достаточно приближенно к современному программированию на каком-нибудь golang).

Получение первого и последнего элементов массива тоже стало проще:

var_dump($array[array_key_first($array)]);  // 456
var_dump($array[array_key_last($array)]); // "string"


А что было до PHP 7.3? Кроме указанного способа по получению ключей, а затем значений, еще с PHP 4, были функции reset() и end(). Были, есть и будут :) И используя их можно получить вполне ожидаемый результат:

var_dump(reset($array));  //456
var_dump(end($array));exit; // "string"

// или те же array_shift, array_pop тоже технически выполнят что нужно

var_dump(array_shift($array)); //456
var_dump(array_pop($array)); // "string"


так зачем тогда все эти телодвижения по вводу новых функций?

Просто все существующие хитрости,семантически являются неправильным подходом, поскольку они изменяют внутреннее состояние массива. Кроме того, это также не работает должным образом для, например, массива, возвращаемого из функции или других подобных непредусмотренных случаев.

А как вы думаете, нужны ли были эти новые функции или итак по старинке справились бы? ❓
  • 👍 100
  • 🔥 20
  • ❤ 11
More from @phpyh
  1. Sep 28, 2026Запустили Пыхник и неделю PHP! Залетайте на первый открытый доклад от Дмитрия Dantes про к…
  2. Sep 15, 2026Сейчас один человек с AI может выполнять работу целого IT-отдела. Только хуёво
  3. Sep 12, 2026Спасибо за заявки! Всем напишу в понедельник. Осталось 1 место.
  4. Sep 11, 2026Хардкорный курс асинхронного PHP https://hardcourse.ru/php/async
  5. Sep 11, 2026Ещё полчасика надо — сайт готов, расписываю программу! 🙏
  6. Sep 10, 2026Краткое содержание: завтра в 12:00 открываю набор на Хардкорный курс асинхронного PHP с уч…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →