You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 16:51:25