Laravel中如何对键不完全一致的JSON数组执行算术减法运算
实现思路
核心是先把两个待运算数组按cat字段做索引映射,避免多层嵌套遍历的匹配问题,再汇总所有出现过的cat值统一做减法运算,规则如下:
- 运算逻辑为
$a2对应cat的total值 - $a1对应cat的total值 - 某数组中不存在对应
cat项时,该数组的取值按0计算 - 最终结果保留所有出现过的
cat项
可直接运行的PHP实现代码
<?php // 原始输入数据 $a1 = [ ["cat" => 2, "total" => 1], ["cat" => 11, "total" => 23], ["cat" => 13, "total" => 30] ]; $a2 = [ ["cat" => 2, "total" => 15], ["cat" => 11, "total" => 13], ["cat" => 15, "total" => 70], ["cat" => 16, "total" => 40] ]; // 辅助方法:将数组按cat字段建立键值映射,实现O(1)复杂度的匹配查找 function buildCatMap(array $arr): array { $map = []; foreach ($arr as $item) { $map[$item['cat']] = $item['total']; } return $map; } $map1 = buildCatMap($a1); $map2 = buildCatMap($a2); // 汇总两个数组中所有出现过的cat值 $allCats = array_unique(array_merge(array_keys($map1), array_keys($map2))); $result = []; foreach ($allCats as $cat) { $val1 = $map1[$cat] ?? 0; $val2 = $map2[$cat] ?? 0; $result[] = [ 'cat' => $cat, 'total' => $val2 - $val1 ]; } // 如果需要结果按cat值升序排列,放开下面这行注释即可 // array_multisort(array_column($result, 'cat'), SORT_ASC, $result); print_r($result);
运行结果
执行代码后得到的$result和预期输出完全一致:
Array ( [0] => Array ( [cat] => 2 [total] => 14 ) [1] => Array ( [cat] => 11 [total] => -10 ) [2] => Array ( [cat] => 13 [total] => -30 ) [3] => Array ( [cat] => 15 [total] => 70 ) [4] => Array ( [cat] => 16 [total] => 40 ) )
补充说明
- 该方案时间复杂度为O(n+m),比嵌套循环匹配的O(n*m)效率高很多,数据量较大时优势明显
- 如果需要实现加法、乘法等其他算术运算,仅需修改循环内
$val2 - $val1部分的运算逻辑即可
内容的提问来源于stack exchange,提问作者cerkes
相关产品推荐
相关产品推荐

