优先用 empty(),但需配合 is_array() 保障类型安全;count() 虽为 O(1) 但对非 Countable 类型会警告,且语义不如 empty() 直接表“空”。

判断空数组该用 empty() 还是 count()?
直接结论:empty() 更安全、更常用,但不是万能的;count() 看似直观,反而容易埋坑。
核心区别在于语义和边界行为:empty() 是语言级“假值检测”,count() 是数值计算。空数组在 PHP 中属于“假值”,所以 empty([]) 返回 true;而 count([]) 返回 0,需要手动比较 === 0 才可靠。
-
empty($arr):对[]、null、false、0、""都返回true—— 如果你只关心“有没有元素”,它够用;但如果$arr可能是0或false(比如函数返回值未校验),就会误判 -
count($arr) === 0:只看长度,不关心类型。但注意:对非数组/Countable 类型(如int、string)会触发警告 ——Warning: count(): Parameter must be an array or an object that implements Countable - PHP 7.2+ 后,
count(null)不再静默返回0,而是报 Warning,这点常被忽略
什么时候必须用 is_array() + empty() 组合?
当你不能完全信任变量类型时,比如从 API、表单或缓存中拿到的数据,可能为 null、string、int,甚至 stdClass 对象。
单独用 empty($arr) 在 $arr = "0" 或 $arr = 0 时也会返回 true,这通常不是你想要的“空数组”逻辑。
立即学习“PHP免费学习笔记(深入)”;
- 安全写法:
is_array($arr) && empty($arr)—— 先保类型,再判空 - 如果允许
Traversable(如ArrayIterator),用is_countable($arr) && count($arr) === 0(PHP 7.3+) - 避免
!$arr这种简写:它等价于empty(),但可读性差,且掩盖了类型风险
count() 在大数组里真慢吗?
不慢。PHP 的数组底层是哈希表,count() 直接读取结构体里的 num_keys 字段,是 O(1) 操作,无论数组有 1 个还是 100 万个元素。
真正影响性能的是误用场景:
- 在循环里反复调用
count($arr)做条件判断(如for ($i = 0; $i )—— 虽然 <code>count本身快,但每次迭代都调用,不如提前存到变量里 - 对未初始化的变量用
count($undefined),会触发 Notice(Undefined variable),比 Warning 更隐蔽 - 在对象上用
count()且该对象没实现Countable,PHP 会尝试调用__toString()或静默失败(旧版本),行为不一致
遇到 count(): Parameter must be an array 错误怎么办?
这是最典型的运行时错误,说明你传给了 count() 一个非数组、非 Countable 的值,比如 null、false、42 或 "hello"。
修复思路不是加 @ 抑制错误,而是明确预期类型:
- 加类型断言:
if (is_array($data) && count($data) > 0) { ... } - 用 null 合并操作符兜底:
count($data ?? [])(适用于$data可能为null的场景) - 如果是函数返回值,优先检查文档或源码,确认它是否保证返回数组;否则默认按“可能为
null”处理 - 注意 JSON 解码:
json_decode($str)默认返回对象,要加第二个参数true才得数组 —— 忘了这个,count()就立刻报错
空数组判断看着简单,但实际要同时扛住类型不确定、历史版本兼容、错误抑制习惯这三重干扰。最稳妥的路径往往就两步:先 is_array(),再 empty() 或 count() === 0。











