count() 默认浅计数只统计顶层元素,多维数组需用 count_recursive 才递归统计;但若只计叶子节点,应使用 array_walk_recursive() 配合计数器。

PHP 的 count() 在多维数组中默认只计算第一层元素个数,不是总元素数量,这点容易误用。
count() 默认是浅计数(COUNT_NORMAL)
对多维数组调用 count($arr) 等价于 count($arr, COUNT_NORMAL),它只统计顶层键的数量,不管子数组内部有多少元素。
- 例如:$arr = [[1, 2], [3, 4, 5], 6]; → count($arr) 返回 3(三个顶层元素:两个数组 + 一个整数)
- 即使子数组为空,如 $arr = [[], [], []]; → count($arr) 仍是 3
需要总元素数?用 COUNT_RECURSIVE
传入第二个参数 COUNT_RECURSIVE 可递归统计所有标量值和数组的总数(注意:它把每个子数组本身也算作一个“元素”)。
- $arr = [[1, 2], [3, 4, 5], 6]; → count($arr, COUNT_RECURSIVE) 返回 8(3个顶层 + 2+3+0个子元素 = 3+2+3+0=8)
- 但注意:它也把中间的子数组计入,比如 [1,2] 和 [3,4,5] 各算 1 个,再加上它们的内部值
- 如果只想统计所有 非数组 的最终值(即叶子节点),count() 无法直接做到,需手动遍历或用 array_walk_recursive()
嵌套中混有非数组值时要小心类型判断
count() 对非数组、非Countable 类型(如字符串、整数、null)会返回 1(PHP 7.2+)或触发警告(旧版本)。所以不能无条件对任意变量用 count()。
立即学习“PHP免费学习笔记(深入)”;
- 错误写法:count($data['items']) —— 若 $data['items'] 是 null 或字符串,可能出错或结果误导
- 安全做法:先用 is_array() 或 is_countable() 判断:
if (is_countable($arr)) { $n = count($arr); }
替代方案:统计纯叶子节点数量
若目标是“所有实际数据项数量”(忽略中间数组结构),推荐用 array_walk_recursive() 配合计数器:
- $count = 0;
array_walk_recursive($arr, function($v) use (&$count) { $count++; }); - 该方式跳过所有数组键,只对每个最终值(字符串、数字、布尔等)执行一次回调
- 比 COUNT_RECURSIVE 更精准,尤其适合处理配置数组、API 返回的嵌套数据











