count() 是获取 PHP 数组元素个数的唯一可靠方法,它直接返回顶层元素数量,不递归;对多维数组需显式传 COUNT_RECURSIVE;array_keys()+count() 多余且低效;使用前应先 is_array() 判断。

count() 是获取 PHP 数组下标数量的唯一可靠方法
PHP 数组本质是有序映射,下标(key)可以是整数或字符串,且不一定连续。所谓“下标数量”,实际就是数组元素个数,count() 返回的就是这个值。别被“下标”二字误导去遍历 key 或用 array_keys() 再套 count()——纯属多余,性能差还可能出错。
count() 的行为与常见误用场景
count() 统计的是顶层元素个数,不递归。对多维数组,它只算第一层键的数量:
- 对
['a' => 1, 'b' => 2],count()返回2 - 对
[0 => [1,2], 1 => [3]],count()仍返回2,不是3 - 若需递归统计所有叶子元素,必须用
count($arr, COUNT_RECURSIVE) - 传入 null 或未定义变量时,
count()返回0(PHP 7.2+),但会触发E_WARNING;建议先用is_array()判断
为什么 array_keys() + count() 是错的
有人写 count(array_keys($arr)),以为这样更“准确”。其实完全没必要:
-
array_keys()会新建一个索引数组,浪费内存和 CPU - 对稀疏数组如
[10 => 'x', 20 => 'y'],array_keys()返回[0 => 10, 1 => 20],再count()还是2,结果一样但绕远路 - 对关联数组含重复 key(PHP 不允许)或对象作为 key(PHP 不支持),该写法会直接报错或静默失败
注意 count() 在对象上的陷阱
如果变量是实现了 Countable 接口的对象(如 SplFixedArray、ArrayObject),count() 也能用,但行为取决于对象内部实现。例如:
立即学习“PHP免费学习笔记(深入)”;
-
new ArrayObject([1,2,3])→count()返回3 -
new SplFixedArray(5)→ 即使只设了$arr[0] = 1,count()仍返回5(容量而非实际元素数) - 自定义类若实现
Countable::count(),返回值完全由你控制,未必等于“下标数量”
所以拿到变量前,先确认它是数组:is_array($var) && count($var) 最稳妥。











