空数组调用 key() 返回 NULL 而非报错或 0,是 PHP 设计行为;应使用 count($arr)===0、empty($arr) 或 $arr===[] 判断空数组,foreach 空数组天然安全无需预判,array_key_first() 可用于 PHP 7.3+ 首键检测。

空数组用 key() 会返回 NULL,不是报错也不是 0
PHP 中对空数组调用 key()、current()、next() 等内部指针函数时,不会触发警告或错误,但统一返回 NULL。这不是 bug,是 PHP 的设计行为——因为数组内部指针根本不存在有效位置。
常见误判写法:
if (key($arr) === 0) { ... } // ❌ 空数组时 key() 是 NULL,不等于 0,但逻辑可能意外跳过正确检测方式应绕开指针函数,直接判断数组结构本身:
-
count($arr) === 0—— 最直观,语义明确 -
empty($arr)—— 简洁,但注意:它同时拦截null、false、0、''等“空值”,仅当确定变量类型是数组时才安全 -
$arr === []—— 严格相等,适合已知是数组且需排除对象/其他类型的情况
foreach 遍历空数组完全安全,不会执行循环体
这是最常被忽略的“检测即使用”场景:你不需要提前判断是否为空,再决定是否 foreach。PHP 的 foreach 对空数组天然静默处理,不报错、不抛异常、不进循环体。
立即学习“PHP免费学习笔记(深入)”;
所以这类写法纯属冗余:
if (!empty($arr)) { foreach ($arr as $k => $v) { ... } }直接写即可:
foreach ($arr as $k => $v) { /* 这里永远不会执行 */ }优势不止于简洁:避免两次数组结构检查(empty() + foreach 内部判断),也规避了条件分支带来的可读性干扰。
用 array_key_first() 判断首键存在性要小心 PHP 版本
PHP 7.3+ 提供了 array_key_first(),它对空数组返回 NULL,可用于间接检测:
if (array_key_first($arr) !== null) { /* 有至少一个键 */ }但要注意:
- PHP
- 它只反映“是否有键”,不区分索引数组/关联数组,也不说明值是否为
null - 性能上比
count($arr) === 0略低(需内部遍历键列表),虽差异微小,但无必要时别为“看起来高级”换函数
不要用 isset($arr[0]) 检测空数组
这是典型误区:索引数组即使非空,也可能没有键 0(比如用 unset() 删除过,或由 array_values() 之外的方式构造)。
反例:
$arr = ['a' => 1, 'b' => 2];
isset($arr[0]); // false,但 $arr 并不空
同样,!$arr 或 !$arr[0] 更危险——会触发 notice(未定义索引),且受 error_reporting 设置影响,行为不稳定。
真正需要“是否存在某下标”的场景,应该明确目标键,例如:
- 查固定键:
array_key_exists('id', $arr) - 查数字索引是否在范围内:
isset($arr[$i]) && $i >= 0 && $i
空数组的下标问题本质是“没有下标”,不是“下标不存在”。盯住这个前提,就很难掉坑里。











