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 8.5.5 PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载立即学习“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 返回的嵌套数据
