PHP count 在多维数组中的注意事项

5次阅读

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

PHP count 在多维数组中的注意事项

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 返回的嵌套数据
text=ZqhQzanResources