应使用 count($arr) === 0 严格判断数组是否为空,因 empty() 会将含 0、false、"" 等 falsy 值的非空数组误判为空;需先 is_array($arr) 再 count,避免警告。

用 empty() 判断最常用,但要注意它把 0、"0"、false 也当空
empty() 是 PHP 里最常被用来“快速判断数组是否为空”的函数,写起来简单:if (empty($arr)) { ... }。但它本质是检查变量是否“被认为为假”,所以不只是数组长度为 0 才返回 true——如果数组存在但第一个元素是 0(比如 ['a' => 0]),empty() 依然返回 true;同理,['id' => false] 或 ['val' => ""] 都会误判。
所以它只适合你**确定数组里不会出现“falsy 值作为有效数据”**的场景,比如纯用户输入过滤后的结果、初始化后未填充的容器。
要严格判断“有没有元素”,必须用 count()
真正判断“数组里有没有键值对”,唯一可靠的方式是 count($arr) === 0。它不关心内容真假,只数个数:
var_dump(count([])); // int(0) var_dump(count(['a' => 0])); // int(1) var_dump(count([0 => false])); // int(1) var_dump(count([''])); // int(1)
注意三点:
立即学习“PHP免费学习笔记(深入)”;
-
count()对非数组类型(如null、字符串、对象)也会返回0或触发警告,所以最好先确保变量是数组:is_array($arr) && count($arr) === 0 - PHP 7.2+ 开始,
count()对未实现Countable接口的对象会抛出Warning,而empty()不会——这点反而让empty()在不确定类型时更“安全”(但语义错误) - 性能上,
count()是 O(1),不用遍历,不用担心大数据量
array_key_exists(0, $arr) 不是用来判断空数组的
有人看到“检查是否存在某个键”就去试 array_key_exists(0, $arr),这是典型误解。这个函数只查指定键存不存在,完全无法反映数组是否为空。比如:
$arr = ['name' => 'Tom']; var_dump(array_key_exists(0, $arr)); // bool(false),但数组明显不空 $arr = [0 => 'x', 1 => 'y']; var_dump(array_key_exists(0, $arr)); // bool(true),但也不能说明“不空”——它本来就不该干这事
类似地,isset($arr[0]) 也不行:它依赖索引存在且非 null,对关联数组(如 ['id' => 123])直接失效。
遇到 null 或未定义变量时,先兜底再判断
真实代码里,$arr 可能根本没声明,或者从 API 返回的是 null。这时候直接 count($arr) 会触发 Warning: count(): Parameter must be an array。
稳妥写法是组合判断:
if (!is_array($arr) || count($arr) === 0) {
// 空或非数组(含 null、string、object 等)
}
或者更明确地拆开:
- 用
isset($arr)确保变量已定义 - 用
is_array($arr)确保是数组类型 - 最后用
count($arr) === 0判断是否真没元素
三者缺一不可。少一个,要么漏掉 null,要么误判字符串,要么在超全局变量未设置时崩掉。



















