应使用array_walk_recursive()函数递归统计多维数组所有叶子元素总数,它自动忽略子数组层级,只计数最底层标量值;手动递归实现需判断is_array后遍历累加,返回1表示单个元素;切勿用count_recursive以免重复计入子数组本身。

要统计多维数组中所有元素的总数,核心是**递归遍历每一层,跳过子数组本身,只对最终的“值”计数**。PHP 提供了现成函数 array_walk_recursive(),它天然忽略中间的数组层级,只访问最底层的标量值(string、int、float、bool、null),用它最简洁可靠。
推荐方法:用 array_walk_recursive() 累加计数
该函数自动深入任意深度,不需手动判断是否为数组,也不会把子数组当作一个元素计入。
- 定义一个计数变量(如 $count = 0)
- 传入数组和一个匿名函数,每次访问到一个非数组值时,$count++
- 函数执行完,$count 就是所有叶子元素的总数
示例:
$count = 0;array_walk_recursive($arr, function($value) use (&$count) { $count++; });
echo $count; // 输出总元素数
手动递归实现(理解原理用)
若想掌握底层逻辑,可写一个递归函数:遇到数组就继续调用自身,遇到非数组就返回 1。
- 函数接收一个参数 $item
- 如果 is_array($item),遍历它,对每个子项递归调用并累加结果
- 否则返回 1(表示这是一个有效元素)
注意:此方式会把 null、false、0、'' 都算作元素(和 array_walk_recursive 一致),如需过滤空值需额外判断。
常见误区提醒
- 不要用 count($arr, COUNT_RECURSIVE) —— 它会把每个子数组本身也当做一个元素计数,导致结果偏大
- 不要用 foreach + is_array 判断后跳过 —— 容易漏掉深层嵌套,或误将数字键名当元素
- 空数组 [] 贡献 0 个元素;含空子数组的结构,不影响其他值的计数
扩展:只统计非空/非null元素
若业务要求排除空字符串、null、false 等“空值”,可在回调中加判断:
array_walk_recursive($arr, function($v) use (&$count) {if ($v !== null && $v !== '' && $v !== false) $count++;
});
根据实际需求调整条件即可,比如用 !empty($v) 或更严格的 is_scalar($v) && strlen(trim((string)$v))。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











