PHP实现同color键下val、val1、val2字段求和的最优方案
PHP数组按color分组并求和val/val1/val2的最优方法
给定如下PHP数组,需要按color字段分组,将每组内的val、val1、val2字段分别求和:
$originalArray = [ ['color' => 'red', 'val' => 4, 'val1' => 4, 'val2' => 4], ['color' => 'green', 'val' => 3, 'val1' => 3, 'val2' => 3], ['color' => 'blue', 'val' => 1, 'val1' => 3, 'val2' => 3], ['color' => 'green', 'val' => 6, 'val1' => 3, 'val2' => 3], ['color' => 'blue', 'val' => 2, 'val1' => 3, 'val2' => 3], ];
期望得到的结果:
Array ( [0] => Array ( [color] => red [val] => 4 [val1] => 4 [val2] => 4 ) [1] => Array ( [color] => green [val] => 9 [val1] => 6 [val2] => 6 ) [2] => Array ( [color] => blue [val] => 3 [val1] => 6 [val2] => 6 ) )
最优解法:一次遍历累加
最高效且易维护的方式是通过单次遍历原数组,以color为键维护结果数组,逐步累加对应字段值,时间复杂度仅为O(n)(n为原数组元素数量):
<?php $originalArray = [ ['color' => 'red', 'val' => 4, 'val1' => 4, 'val2' => 4], ['color' => 'green', 'val' => 3, 'val1' => 3, 'val2' => 3], ['color' => 'blue', 'val' => 1, 'val1' => 3, 'val2' => 3], ['color' => 'green', 'val' => 6, 'val1' => 3, 'val2' => 3], ['color' => 'blue', 'val' => 2, 'val1' => 3, 'val2' => 3], ]; $result = []; foreach ($originalArray as $item) { $color = $item['color']; // 初始化当前color的统计项(首次出现时) if (!isset($result[$color])) { $result[$color] = [ 'color' => $color, 'val' => 0, 'val1' => 0, 'val2' => 0, ]; } // 累加对应字段值 $result[$color]['val'] += $item['val']; $result[$color]['val1'] += $item['val1']; $result[$color]['val2'] += $item['val2']; } // 若需要将关联数组转为索引数组,去掉color作为键名 $result = array_values($result); print_r($result); ?>
解法说明
- 遍历过程中,用
color作为结果数组的键,避免重复分组判断; - 首次遇到某个
color时,初始化其统计结构; - 后续遇到同
color的元素,直接累加对应字段值; - 最后通过
array_values()将结果转为索引数组,匹配期望输出格式。
内容的提问来源于stack exchange,提问作者arunfrancis
相关产品推荐
相关产品推荐

