如何按Date键分组,对A_Total、B_Total、C_Total分别求和?
PHP按日期分组求和A_Total、B_Total、C_Total字段
需求说明
现有一个包含Date、A_Total、B_Total、C_Total字段的数组,需要按Date分组,对每组对应的三个Total字段分别求和,得到聚合后的结果。
源数组
Array ( [0] => Array ( [Date] => 2022-10-23 [A_Total] => 547 [B_Total] => 70 [C_Total] => 83 ) [1] => Array ( [Date] => 2022-10-24 [A_Total] => 547 [B_Total] => 70 [C_Total] => 83 ) [2] => Array ( [Date] => 2022-10-25 [A_Total] => 552 [B_Total] => 70 [C_Total] => 83 ) [3] => Array ( [Date] => 2022-10-23 [A_Total] => 5 [B_Total] => 1 [C_Total] => 19 ) [4] => Array ( [Date] => 2022-10-24 [A_Total] => 5 [B_Total] => 1 [C_Total] => 19 ) [5] => Array ( [Date] => 2022-10-25 [A_Total] => 5 [B_Total] => 1 [C_Total] => 19 ) [6] => Array ( [Date] => 2022-10-23 [A_Total] => 557 [B_Total] => 134 [C_Total] => 51 ) [7] => Array ( [Date] => 2022-10-24 [A_Total] => 557 [B_Total] => 134 [C_Total] => 51 ) [8] => Array ( [Date] => 2022-10-25 [A_Total] => 557 [B_Total] => 134 [C_Total] => 51 ) )
预期结果
Array ( [0] => Array ( [Date] => 2022-10-23 [A_Total] => 1019 [B_Total] => 205 [C_Total] => 153 ) [1] => Array ( [Date] => 2022-10-24 [A_Total] => 1019 [B_Total] => 205 [C_Total] => 153 ) [2] => Array ( [Date] => 2022-10-25 [A_Total] => 1114 [B_Total] => 205 [C_Total] => 153 ) )
解决方案
方法1:基础循环遍历
通过遍历源数组,以日期为键创建临时数组,累加对应字段的值,最后转换为索引数组:
$sourceArray = // 你的源数组 $grouped = []; foreach ($sourceArray as $item) { $date = $item['Date']; if (!isset($grouped[$date])) { $grouped[$date] = [ 'Date' => $date, 'A_Total' => 0, 'B_Total' => 0, 'C_Total' => 0 ]; } $grouped[$date]['A_Total'] += $item['A_Total']; $grouped[$date]['B_Total'] += $item['B_Total']; $grouped[$date]['C_Total'] += $item['C_Total']; } // 转为索引数组 $result = array_values($grouped); print_r($result);
方法2:使用array_reduce简化代码
利用array_reduce函数遍历数组并累加,代码更简洁:
$sourceArray = // 你的源数组 $result = array_values(array_reduce($sourceArray, function ($carry, $item) { $date = $item['Date']; if (!isset($carry[$date])) { $carry[$date] = $item; } else { $carry[$date]['A_Total'] += $item['A_Total']; $carry[$date]['B_Total'] += $item['B_Total']; $carry[$date]['C_Total'] += $item['C_Total']; } return $carry; }, [])); print_r($result);
两种方法都会得到与预期一致的分组求和结果,可根据代码风格偏好选择使用。
内容的提问来源于stack exchange,提问作者kent2004
相关产品推荐
相关产品推荐

