多维数组按day去重并聚合求和movements值问题求助
解决按Day合并数组并累加Movements的问题
我来帮你搞定这个数组处理的需求——你需要把数组中day值相同的项合并,同时对对应的movements字段求和,保留唯一的day值对吧?先分析下你现有方案的问题,再给你正确的实现方法。
现有方案的问题
- 你提到的
sum-array-values-of-the-same-key方法会把所有同键名的值都求和,包括day字段(把字符串"11"当成数字处理求和,显然不符合预期)。 - 你自己编写的代码逻辑有问题:你是在对比
$arr1和$arr2相同索引位置的day值,这只有当两个数组对应位置的day完全一致时才会生效,但实际相同day的项可能分散在不同索引;而且每次循环都array_push($sum, $result),会导致结果数组里出现大量重复或错误的项。
正确的实现方法
情况1:处理单个数组(比如你给出的基础数组示例)
我们可以用day作为临时数组的键,快速判断是否已经存在该day的项,存在就累加movements,不存在就初始化项,最后再转成数字索引数组:
// 假设这是你的基础数组 $originalArray = [ ['day' => '11', 'movements' => 1], ['day' => '11', 'movements' => 1], ['day' => '11', 'movements' => 1], ['day' => '12', 'movements' => 1], ['day' => '12', 'movements' => 1], ['day' => '12', 'movements' => 1], ]; $summedArray = []; foreach ($originalArray as $item) { $day = $item['day']; // 如果当前day已经在结果数组中,累加movements if (isset($summedArray[$day])) { $summedArray[$day]['movements'] += $item['movements']; } else { // 否则初始化该day的项 $summedArray[$day] = [ 'day' => $day, 'movements' => $item['movements'] ]; } } // 把关联数组转成数字索引数组,符合你期望的格式 $summedArray = array_values($summedArray);
运行后$summedArray的结果就是:
[ ['day' => '11', 'movements' => 3], ['day' => '12', 'movements' => 3], ]
情况2:处理两个数组($arr1和$arr2)合并后求和
如果你的需求是把$arr1和$arr2的所有项合并,再按day求和movements,只需要先合并两个数组,再用上面的逻辑处理:
$arr1 = $stats['data']['vhc']; $arr2 = $data['vhc']; // 先合并两个数组 $combinedArray = array_merge($arr1, $arr2); $summedArray = []; foreach ($combinedArray as $item) { $day = $item['day']; if (isset($summedArray[$day])) { $summedArray[$day]['movements'] += $item['movements']; } else { $summedArray[$day] = [ 'day' => $day, 'movements' => $item['movements'] ]; } } $summedArray = array_values($summedArray);
这个方法的优势是效率高,只需要遍历一次数组,而且能准确处理所有分散在不同位置的同day项。
内容的提问来源于stack exchange,提问作者flydev
相关产品推荐
相关产品推荐

