array_column + array_sum最快且轻量,适用于结构规整的二维数组;array_reduce更灵活,适合不规则结构或条件累加;foreach需注意初始化和键存在性;避免array_merge展开,易致数据错位。

直接用 array_column + array_sum 最快
如果二维数组结构规整(比如全是 ['amount' => 10, 'price' => 20] 这种),想按某个键求和,array_column 提取列再 array_sum 是最轻量、性能最好的方式。它不重建数组,只做一次遍历提取,避免了嵌套循环或 array_reduce 的函数调用开销。
常见错误是没确认键是否存在就硬提,导致 E_WARNING 或返回 false:
- 用前先
isset($item['amount'])判断,或加@抑制警告(不推荐) - 若键名不统一(如有的叫
total,有的叫sum),这方法直接失效,得换策略 - 注意
array_column在 PHP 7.0+ 才支持第三个参数(作为新键),但求和不需要它
$data = [['id'=>1, 'val'=>5], ['id'=>2, 'val'=>15]]; $sum = array_sum(array_column($data, 'val')); // 20
用 array_reduce 处理不规则结构
当二维数组里每个子数组字段不一致、或需要条件累加(比如只加 status === 'paid' 的金额),array_reduce 更灵活。它把累加逻辑完全交给你控制,但要注意初始值类型必须匹配结果预期——求和就得设成 0,否则可能触发字符串拼接。
-
回调函数第一个参数是累加器(
$carry),第二个是当前项($item),别写反 - 若子数组可能为
null或缺失目标键,必须在回调里做防御性检查,否则报Notice: Undefined index - 性能比
array_column + array_sum略低,但差异在万级数据内几乎不可测
$sum = array_reduce($data, function($carry, $item) {
return $carry + ($item['amount'] ?? 0);
}, 0);
避免用 foreach 手动循环的典型陷阱
很多人习惯写 foreach 累加,语法直观但容易埋坑。最常出问题的是变量作用域和初始化位置:在循环外漏声明 $sum = 0,或在循环内重复初始化,导致只加最后一个值。
立即学习“PHP免费学习笔记(深入)”;
- 别在
foreach内写$sum = 0—— 每次迭代都重置 - 如果二维数组有深层嵌套(如
['items' => [['price'=>10], ['price'=>20]]]),直接foreach只能拿到第一层,得加第二层循环或递归 - 用引用(
&$item)纯属多余,求和不需要改原数组
$sum = 0;
foreach ($data as $item) {
$sum += $item['value'] ?? 0; // 正确
}
不要用 array_merge + call_user_func_array 模拟“转一维”
网上有些方案先用 array_merge(...$arr) 把二维“压平”,再 array_sum,看似一步到位,实则危险:一旦子数组含非数值键(如 ['name'=>'a', 'val'=>5]),array_merge 会丢弃键名并重排索引,导致数据错位;更糟的是,若任意子数组本身是关联结构,合并后可能覆盖同名键,求和结果完全不可信。
- PHP 5.6+ 支持
...展开,但仅适用于“每项都是数值索引一维数组”的场景 - 哪怕结构看似规整,只要有一项多一个字段(比如某条多了
'tax' => 1.5),array_merge就会把它也塞进结果数组,污染求和源 - 这个操作时间复杂度是 O(n×m),远高于前几种方案
真正需要“转一维”再处理的场景极少,绝大多数求和需求,绕过中间展开步骤更安全、更快。











