不能。array_sum只处理一维数组,多维数组中子数组会被当作0或触发警告;需先扁平化,推荐array_walk_recursive安全高效,json_encode+正则快但易误匹配。

array_sum 能直接累加多维数组吗?
不能。array_sum 只处理一维数组,遇到嵌套结构会把子数组当 0 或触发警告(PHP 8.0+ 报 Warning: array_sum(): Argument #1 ($array) must be of type array, int given 这类错误)。比如:
$arr = [1, [2, 3], 4]; echo array_sum($arr); // 输出 5([2,3] 被当成 0)
想对「PISO」类多维数组求和,得先扁平化
所谓“PISO”(可能指“PHP 多维数组”误写或特定业务缩写),实际就是含多层键值的嵌套数组。必须先展开再求和。推荐两种稳妥方式:
- 用
array_walk_recursive收集所有数值:$flat = []; array_walk_recursive($arr, function($v) use (&$flat) { if (is_numeric($v)) $flat[] = (float)$v; }); $sum = array_sum($flat); - 用
json_encode+ 正则提取数字(仅限纯数据、无字符串干扰时):$nums = array_map('floatval', preg_match_all('/-?\d+\.?\d*/', json_encode($arr), $m) ? $m[0] : []); $sum = array_sum($nums);—— 这种写法快但危险,一旦数组里有带数字的字符串(如"item_123"),就会误匹配
array_sum 的隐式类型转换陷阱
array_sum 对非数字值一律转为 0,但这个过程不报错,容易掩盖数据问题:
-
array_sum(['1', '2.5', null, false, 'abc'])→ 结果是3.5(null和false变0,'abc'也变0) - 如果业务要求严格校验,得先过滤:
$valid_nums = array_filter($arr, 'is_numeric'); $sum = array_sum(array_map('floatval', $valid_nums)); - 注意
is_numeric('0xFF')返回true,但array_sum不识别十六进制字符串,会当0处理
性能对比:递归遍历 vs array_walk_recursive vs 自定义 flatten
对深度 ≤ 5、元素 ≤ 10000 的数组,三者差异不大;但要注意:
立即学习“PHP免费学习笔记(深入)”;
-
array_walk_recursive最快,且原生支持跳过对象和资源(自动忽略) - 手写递归函数若没控制好引用或没剪枝,可能栈溢出或重复计数
-
json_encode方案在超大数组上内存占用高,且 JSON 编码本身有开销
真正容易被忽略的是:如果数组键名含中文或特殊符号,array_walk_recursive 仍能正常工作,而基于 json_encode 的方案可能因编码失败中断 —— 这点在处理用户输入或日志数据时特别关键。











