count() 是 php 获取数组元素个数唯一可靠方法,语义明确、性能O(1),支持递归统计;应避免 sizeof()、在 while 条件中使用及对非 Countable 类型调用。

count() 是唯一可靠的方法,别信 sizeof()
PHP 里获取数组元素个数,count() 是官方唯一推荐、语义明确、行为稳定的方式。sizeof() 确实是 count() 的别名,但它是历史遗留的 alias,不建议用——代码可读性差,ide 不提示,新人容易误以为是“内存大小”相关函数。
常见错误现象:有人在递归数组里用 count() 却没设第二个参数,结果返回远大于预期的数字;或者在对象上直接调用,抛出 Warning: count(): Parameter must be an Array or an Object that implements Countable。
- 只对数组和实现了
Countable接口的对象有效,对NULL、字符串、整数会触发警告 - 支持第二个参数:
COUNT_RECURSIVE(即1),用于统计多维数组所有层级的元素总数 - 性能上,
count()是 O(1) 操作(PHP 7.2+ 对数组长度做了内部缓存),无需担心循环遍历开销
判断数组是否为空,别用 count() == 0
想确认数组有没有元素,直接用 empty() 或 !$array 更安全、更快,也更符合 PHP 的惯用写法。
使用场景:表单提交后检查 $_POST['tags'] 是否有值、API 返回数据前校验数组字段是否存在有效项。
立即学习“PHP免费学习笔记(深入)”;
-
empty($arr)自动处理null、未定义变量、空数组,不会报 warning -
count($arr) === 0在$arr是null或根本未声明时会触发 notice -
isset($arr) && count($arr) > 0写法冗长,且仍无法覆盖$arr = false这类边缘情况
关联数组、稀疏数组、对象数组都适用 count()
count() 统计的是“键值对数量”,跟键名类型、是否连续、是否跳号完全无关。它不关心你用的是 0,1,2 还是 'name','age','city',甚至 999 => 'a', 1000000 => 'b' 也没问题。
容易踩的坑:有人把 array_keys() 或 array_values() 的结果再套一层 count()——纯属多余,徒增函数调用开销。
- 稀疏索引数组(如
[0 => 'a', 5 => 'b'])中,count()返回 2,不是 6 - 关联键含非数字字符串,不影响计数逻辑
- 对象若实现了
Countable接口(比如 laravel 的Collection),count()也能正常工作
count() 在 foreach 中反复调用没问题,但别在 while 条件里写
很多人担心“每次循环都调用 count() 影响性能”,其实不必——PHP 内部已优化,多次调用开销几乎为零。真正要避开的是把它放在 while 或 for 的条件判断中,尤其当数组可能被修改时。
示例错误写法:for ($i = 0; $i ——循环次数会因数组缩短而提前结束,逻辑错乱。
- foreach 遍历时,
count()放在哪都安全,PHP 不会重复计算 - for 循环中,应提前缓存:
$len = count($items); for ($i = 0; $i - while 场景下,如果循环体里会增删元素,必须把
count()移到循环体内或单独判断
最常被忽略的一点:count() 对资源类型(Resource)、闭包(Closure)、标量值(String/int/Float/bool)直接报错,不是返回 0。遇到动态传入的变量,先用 is_array() 或 is_countable() 做兜底,比硬扛 warning 更稳妥。