PHP多维数组按number键分组求和:两种结构的高效实现方法
高效分组求和解决方案
别用嵌套foreach,那会让时间复杂度升到O(n²),效率很低。下面是两种数组结构的最优解法,都是单循环遍历一次原数组,时间复杂度O(n),计算量最小:
第一种数组结构(values嵌套子数组)
$array = [ ['number' => 1, 'values' => ['a' => 1, 'b' => 2]], ['number' => 2, 'values' => ['a' => 4, 'b' => 1]], ['number' => 2, 'values' => ['a' => 1, 'b' => 4]], ['number' => 2, 'values' => ['a' => 1, 'b' => 1]], ['number' => 3, 'values' => ['a' => 2, 'b' => 4]] ]; $array_output = []; foreach ($array as $item) { $number = $item['number']; // 初始化当前number的分组项 if (!isset($array_output[$number])) { $array_output[$number] = [ 'number' => $number, 'values' => ['a' => 0, 'b' => 0] ]; } // 累加对应数值 $array_output[$number]['values']['a'] += $item['values']['a']; $array_output[$number]['values']['b'] += $item['values']['b']; } // 重置为连续数字索引 $array_output = array_values($array_output); // 输出结果 print_r($array_output);
执行后会得到你期望的分组求和结果,临时用number作为键来分组,最后用array_values()把索引转成连续数字。
第二种数组结构(直接包含a、b字段)
$array = [ ['number' => 1, 'a' => 1, 'b' => 2], ['number' => 2, 'a' => 4, 'b' => 1], ['number' => 2, 'a' => 1, 'b' => 4], ['number' => 2, 'a' => 1, 'b' => 1], ['number' => 3, 'a' => 2, 'b' => 4] ]; $array_output = []; foreach ($array as $item) { $number = $item['number']; // 初始化当前number的分组项 if (!isset($array_output[$number])) { $array_output[$number] = [ 'number' => $number, 'a' => 0, 'b' => 0 ]; } // 直接累加a、b字段 $array_output[$number]['a'] += $item['a']; $array_output[$number]['b'] += $item['b']; } // 重置为连续数字索引 $array_output = array_values($array_output); // 输出结果 print_r($array_output);
这个逻辑和第一种一致,只是不需要嵌套访问values子数组,直接操作a、b字段即可。
内容的提问来源于stack exchange,提问作者PHPKiatofiaFlowOverUs
相关产品推荐
相关产品推荐

