<p>array_first() 是 PHP 8.5+ 原生函数,安全获取数组首值且不修改内部指针;适用于需保持遍历状态的场景,优于 reset()+current()、array_key_first() 和 array_values()[0],空数组返回 null,兼容关联与非连续键,PHP 8.4- 可用一行兼容实现。</p>

array_first() 在 PHP 8.5+ 中直接可用,无需额外安装或兼容层 —— 它是原生函数,行为稳定、无副作用、不修改原数组内部指针。
什么时候该用 array_first() 而不是 reset() + current()
当你需要安全读取第一个值,又不想干扰后续对同一数组的遍历(比如在循环中多次调用、或与 foreach 混用)时,array_first() 是唯一干净的选择。
-
reset($arr); $first = current($arr);会把数组指针重置到开头,如果之后还要foreach或手动next(),结果可能错乱 -
array_key_first()返回的是键,不是值,你还得再套一层$arr[...],多一次查找且易出错(比如键不存在) -
array_values($arr)[0] ?? null会强制重建索引数组,对大数组性能差,且触发内存复制
array_first() 对关联数组和非连续键的处理
它不依赖键是否为整数、是否从 0 开始,只按数组「实际存储顺序」取第一个值 —— 这个顺序就是 var_dump() 显示的顺序,也是 foreach 遍历的顺序。
-
$arr = [1 => 'a', 0 => 'b', 3 => 'c'];→array_first($arr)返回'a'(因为1 => 'a'是插入的第一个元素) - 空数组
[]直接返回null,可安全配合空合并操作符:$first = array_first($arr) ?? 'default'; - 键名含字符串、布尔、null 等都正常工作,只要数组结构合法
PHP 8.5 之前怎么临时用上 array_first()
如果你还在用 PHP 8.4 或更低版本,但项目已依赖这个语义,可以用最简兼容实现,避免引入框架或全量 polyfill:
立即学习“PHP免费学习笔记(深入)”;
if (!function_exists('array_first')) {
function array_first(array $array): mixed {
return $array === [] ? null : $array[array_key_first($array)];
}
}
- 这个实现复用了 PHP 7.3+ 就有的
array_key_first(),兼容性极广 - 不要用
isset($array[0])或key($array)替代 —— 前者只适用于数字索引,后者在空数组上会警告 - 注意:自定义版本无法处理引用数组中的引用语义(原生函数可以),但绝大多数业务场景不涉及这点
真正容易被忽略的是:array_first() 和 array_last() 的行为一致性 —— 它们共享同一套底层逻辑,都基于 PHP 内部哈希表的插入顺序。这意味着你在调试时不能假设“键小的就是第一个”,而要看实际构造顺序。这点在动态生成数组(比如 array_merge()、+ 合并)后尤其关键。



















