key()仅返回当前内部指针指向元素的键名,不移动指针;必须配合reset()、current()、next()手动遍历,或直接用foreach($arr as $k => $v);PHP 7.3+推荐array_key_first()/array_key_last()替代。

key() 函数只读当前内部指针指向的键名,不移动指针
key() 不是“遍历用函数”,它只是快照式地返回数组内部指针当前所指元素的键名。指针初始在第一个元素,但一旦你调用 next()、prev()、reset() 或 end(),key() 的结果就会变——它永远不主动推进,只被动反映指针位置。
常见错误是把它塞进 foreach 里混用:foreach ($arr as $value) { $k = key($arr); }
这几乎一定出错:因为 foreach 自己已经把内部指针移到下一个元素了,你拿到的 $k 是下一个元素的键,不是当前 $value 对应的键。
- 正确做法:直接用
foreach ($arr as $key => $value),$key就是你要的 - 必须用
key()的场景:比如你在手动控制指针(reset()→key()→current()→next())做底层遍历 - 指针越界时
key()返回NULL,记得判空,否则可能触发 notice
array_keys() 和 key() 完全是两回事
array_keys() 返回一个包含所有键名的**新数组**,而 key() 只返回**当前一个键名**(标量)。它们解决的问题完全不同:
- 要“列出全部键”:用
array_keys($arr) - 要“查某个值第一次出现的键”:用
array_search($val, $arr) - 要“查某个值所有出现位置的键”:用
array_keys($arr, $val) - 要“在 while 循环里边走边取键”:必须配
reset()+key()+current()+next(),不能只靠key()
别因为名字带 “key” 就默认它们可互换——key() 是游标操作,array_keys() 是数据提取。
用 while + key() 手动遍历时的典型写法
如果你确实需要手动控制指针(比如兼容老代码、或封装自定义迭代器),标准写法是:
立即学习“PHP免费学习笔记(深入)”;
reset($arr);
while (false !== current($arr)) {
$k = key($arr);
$v = current($arr);
// 处理 $k 和 $v
next($arr);
}
注意三点:
- 必须先
reset($arr),否则指针可能在任意位置(比如之前被其他函数动过) - 循环条件用
false !== current($arr),而不是current($arr) !== false,避免0或''被误判为结束 -
next()放在最后,确保本次循环处理的是当前指针对应的元素
PHP 7.3+ 推荐替代方案:array_key_first() 和 array_key_last()
如果只是为了取第一个或最后一个键名,key() 加 reset() 太绕。PHP 7.3 起提供了更安全直接的函数:
- 第一个键:
array_key_first($arr),空数组返回NULL - 最后一个键:
array_key_last($arr),空数组也返回NULL
这两个函数不依赖内部指针,也不修改数组状态,比 reset() + key() 组合更轻量、更可靠。但注意:它们只适用于 PHP ≥ 7.3;低版本需自行 fallback 到 array_keys($arr)[0] 或 end(array_keys($arr)),不过后者会改变指针,得小心。
真正容易被忽略的是:key() 的行为完全绑定数组内部指针,而这个指针是全局、可变、易被干扰的——哪怕同一数组,在不同函数调用之间状态都可能已变。别把它当纯函数用。



















