empty() 判定空数组不安全,因对 null、false、0、"0"、"" 等均返回 true;count() 单独使用也不行,因对非数组类型如字符串、对象也返回 0 或行为不一致;最稳妥写法是 is_array($arr) && count($arr) === 0。

empty() 最快但不精准,count() 更准但需防类型错误,真正安全的写法是 is_array($arr) && count($arr) === 0。
用 empty() 判断空数组会出什么问题
empty() 对空数组返回 true,但它对 null、false、0、"0"、"" 也返回 true。如果变量本就不是数组,比如 $arr = null 或 $arr = "0",empty($arr) 依然返回 true,你会误以为它是个空数组。
常见错误现象:
- 接口传参缺失时默认为
null,用empty()判定后走空数组逻辑,实际根本不是数组 - 前端传了字符串
"0"当作数组 JSON 解析失败,结果被当成空数组处理
为什么单独用 count() 也不行
count() 对非数组类型(如 null、字符串、对象)也会返回 0,而不是报错或抛异常。这意味着 count("hello") === 0 是 true,显然不合理。
使用场景中容易踩的坑:
立即学习“PHP免费学习笔记(深入)”;
-
$arr = "abc"→count($arr) === 0成立,但你本意是筛数组 -
$arr = new stdClass()→count($arr)返回1(PHP 7.2+),但在旧版本可能返回0,行为不一致 - 没做类型校验就直接
foreach($arr as ...),遇到字符串会 Warning
is_array() && count() === 0 是最稳妥的组合
这个判断同时覆盖了「是不是数组」和「有没有元素」两个维度,能准确区分 []、null、""、0、false 等所有干扰值。
实操建议:
- 永远把
is_array()放在前面,利用短路特性:如果!is_array($arr)为真,后面count()根本不会执行 - 用严格比较
=== 0,避免== 0把false或""误判 - 不要省略括号:
is_array($arr) && count($arr) === 0比is_array($arr) && !count($arr)更清晰、无歧义
其他方法适用场景有限
key($arr) === null 看似巧妙,但要求数组指针在开头;如果之前调过 next() 或 current(),结果不可靠,还得先 reset($arr),多一步就多一个出错点。
isset($arr[0]) 只对数字索引有效,['name' => 'a'] 这种关联数组即使非空也会返回 false,不能当空数组用。
复杂点在于:空数组判定从来不只是“长度为 0”,而是“它得真是个数组,且长度为 0”。漏掉类型检查,等于把门锁换成贴纸。



















