会。PHP的array_sum对二维数组仅浅层遍历,子数组转整型为0,导致结果失真;三种降维方式需据结构规则性、键名保留需求及性能要求选择;求平均时须确保统计元素数与原始数值总数一致,并过滤非数值项。

二维数组直接用 array_sum 会出错吗?
会。PHP 的 array_sum 对二维数组只做浅层遍历,遇到子数组就返回 0(因为子数组转整型是 0),结果完全失真。比如:
$arr = [[1, 2], [3, 4]]; echo array_sum($arr); // 输出 0,不是 10这不是 bug,是设计行为——
array_sum 不递归。
三种可靠降维方式怎么选?
关键看结构是否规则、是否允许丢键、性能是否敏感:
-
array_merge(...$arr):仅适用于所有子数组都是数字索引且不关心键名的场景;若含字符串键,会被重置,且 PHP 5.6+ 才支持展开操作符 -
array_reduce($arr, 'array_merge', []):兼容老版本 PHP,但每次array_merge都复制数组,大数据量时内存和时间开销明显 -
array_walk_recursive+ 回调收集:最通用,能处理混合键、嵌套更深的结构,且只遍历一次,推荐用于不确定数据结构的场景
计算平均值时 count() 容易漏掉什么?
降维后必须确认元素个数是否等于原始数值总数。常见陷阱:
- 用
count($flattened)没问题,但若误用count($original)(即二维数组外层数量),结果会严重偏高 - 如果原始数组含
null、空数组或非数值项,array_walk_recursive默认仍会遍历进去,需在回调里过滤:$values = [];array_walk_recursive($arr, function($v) use (&$values) { if (is_numeric($v)) $values[] = (float)$v; });$avg = !empty($values) ? array_sum($values) / count($values) : 0;
有没有一行安全求平均的写法?
有,但仅限简单场景(纯数字二维、无空/非数值):
立即学习“PHP免费学习笔记(深入)”;
$avg = array_sum(array_merge(...$arr)) / count(array_merge(...$arr));
注意:这行代码执行两次 array_merge(...$arr),效率低;且一旦某子数组为空或含非数字,array_sum 和 count 结果就不匹配。真正健壮的逻辑没法压缩成一行,得拆开判断空数组、过滤类型、再求均值。











