PHP 8.5 的新引入的原生函数 array_first 和 array_last 非常重要!
PHP 8.5 引入了两个备受期待的新函数 array_first()和 array_last(),虽然看似只是小改进,但这标志着 PHP 在开发者体验上的重要进步,也显示出其正逐步拥抱函数式编程思维。
为什么 PHP 需要这两个函数?
在 PHP 8.5 之前,开发者获取数组首尾元素通常有以下几种方式,但都存在明显缺点:
// 方式1:使用 array_key_first()
$first = $arr[array_key_first($arr)];
// 方式2:使用 reset()(会修改数组内部指针)
reset($arr);
$first = current($arr);
// 方式3:array_shift()(会修改原数组)
$first = array_shift($arr);
// 方式4:array_values() 变通方案(冗长)
$first = array_values($arr)[0] ?? null;
这些解决方案都有缺点:
reset()和end()会改变数组内部指针;array_key_first()和array_key_last()返回的是键而不是值;array_shift()和array_pop()会破坏原数组;array_values方案显得冗长;- 各框架自定义函数(如 Laravel 的
collect($arr)->first())存在兼容性问题。
PHP 新函数和用法
array_first()和 array_last() 以原生、非破坏性且指针安全的方式解决了上述问题:
function array_first(array $array): mixed
function array_last(array $array): mixed
分别返回数组的第一个或者最后一个元素,如果数组是空则返回 null。
基本索引数组
$fruits = ["apple", "banana", "cherry"];
echo array_first($fruits); // "apple"
echo array_last($fruits); // "cherry"
非连续键的关联数组
$users = [
101 => 'Alice',
205 => 'Bob',
330 => 'Charlie',
];
echo array_first($users); // "Alice"
echo array_last($users); // "Charlie"
空数组
$data = [];
var_dump(array_first($data)); // NULL
var_dump(array_last($data)); // NULL
函数返回的数组
function getNumbers(): array {
return [100, 200, 300];
}
echo array_first(getNumbers()); // 100
echo array_last(getNumbers()); // 300
以前使用 reset() 或者 end() 可能会导致错误,现在则无副作用,无警告。
包含布尔值和引用值的数组
$flag = true ;
$items = [& $flag , false , "final" ];
echo array_first ( $items ); // true
echo array_last ( $items ); // "final"
即使存在引用,其值也是按值处理的,从而确保清晰度和一致性。
标志着 PHP 的函数式编程演进
这两个新函数体现了 PHP 向更函数式、更声明式的编程风格靠拢。
// 以前的命令式风格
reset($arr);
$first = current($arr);
// 现在的声明式风格
$first = array_first($arr);
函数式编程,许多开发者在 JavaScript 或 Python 中对此并不陌生。
// JavaScript 风格的
const first = arr[ 0 ];
// PHP 8.5
$first = array_first ( $arr );
这种变化让代码更清晰、更安全,且不依赖任何框架。
所以 array_first() 和 array_last() 虽是小功能,却是 PHP 语言演进的重要一步。它们以优雅的方式解决了数组操作的常见痛点,让代码更简洁、更安全。