应使用 reset() + current() 或 array_key_first() 获取数组首元素;前者需先重置指针再取值,后者(PHP 7.3+)更简洁安全,避免性能损耗与键丢失。

用 current() + reset() 拿到数组第一个元素
PHP 数组是带内部指针的,current() 返回当前指针位置的值,但遍历开始前指针不一定在开头——尤其数组是函数返回值或经过修改后。所以必须先用 reset() 把指针拨回首位,再调 current() 才可靠。
常见错误是直接 current($arr),结果返回 false 或意外值,尤其当数组刚被 end()、next() 或 foreach 走过一遍后。
-
reset($arr)总是返回第一个键(key),成功时返回该 key,失败(空数组)返回false -
current($arr)依赖当前指针,不重置就不可靠 - 对引用数组或对象属性数组也适用,但不能用于未初始化的变量
foreach 中判断是否为首个迭代项
如果是在循环里需要“只处理第一个”,别依赖计数器从 0 开始(比如 $i === 0),因为 PHP 数组键可能不连续或非数字(如 ['a' => 1, 'b' => 2])。更稳妥的是用 key($arr) === key($arr)?不行——得靠指针状态。
实际做法:在 foreach 前用 $firstKey = key(reset($arr)) 记下首键,循环中用 key($arr) 对比;但更轻量的是用布尔标记:
立即学习“PHP免费学习笔记(深入)”;
$isFirst = true;
foreach ($arr as $k => $v) {
if ($isFirst) {
// 处理第一个
$isFirst = false;
}
// 其他逻辑
}
注意:这个 $isFirst 标记只在首次进入循环体时生效,不受键类型影响,也避免了每次调 key() 的开销。
用 array_key_first()(PHP 7.3+)最简洁
PHP 7.3 起内置了 array_key_first(),直接返回第一个键名,配合 $arr[$key] 就拿到值,无需操作指针,也不依赖 foreach 状态。
- 空数组返回
null,需判空:$key = array_key_first($arr); if ($key !== null) { $first = $arr[$key]; } - 比
key(array_values($arr))高效,后者会重建索引,破坏原始键关联 - 不改变原数组,线程安全,适合在函数内多次调用
为什么不用 array_values($arr)[0]?
看似简单,但隐患明显:它强制重排索引,对大数组性能差(O(n) 时间 + 额外内存),且丢失原始键信息。更危险的是,当 $arr 是空数组时,array_values($arr)[0] 触发 Notice: Undefined offset: 0,而 array_key_first() 或 reset()+current() 都能自然返回 null 或 false,更容易防御。
如果真要下标取,至少包一层 isset():isset(array_values($arr)[0]) ? array_values($arr)[0] : null —— 但重复调 array_values() 更慢,不推荐。
真正要注意的是:数组是否为空、是否为真实数组(不是 Traversable)、以及 PHP 版本兼容性——老项目没 7.3 就只能用 reset()+current() 组合。



















