PHP实现两数组同ID元素减法运算并保留全部ID的最优方案
解决PHP数组元素按ID减法并合并所有ID的问题
嘿,我来帮你搞定这个数组处理的问题!你现在的代码只处理了$sales里的元素,完全没考虑$returns中独有的ID,而且还把变量名搞混了(比如用了despatch_qty但实际应该是sale_qty)。下面给你一个高效且简洁的实现方案,既能覆盖所有ID,又能正确执行减法运算。
核心思路
为了避免嵌套循环的低效(时间复杂度O(n*m)),我们可以先把数组转换成以id为键的关联数组,这样查找和修改元素的时间复杂度就变成O(1)了,整体效率提升很多。具体步骤:
- 把
$sales转成以id为键的数组,方便快速定位 - 遍历
$returns数组:- 如果当前ID在
$sales中存在,就把$sales对应元素的sale_qty和sale_weight减去$returns里的对应值 - 如果ID不存在,就直接把这个元素添加到结果数组里
- 如果当前ID在
- 最后把结果转换成索引数组(如果需要保持原数组的索引形式)
完整代码实现
<?php // 示例数据 $sales = [ ['id' => 13, 'name' => 'Rahul', 'sale_qty' => 2, 'sale_weight' => 38.00], ['id' => 14, 'name' => 'shravandhika', 'sale_qty' => 1, 'sale_weight' => 12.00], ['id' => 3, 'name' => 'veena', 'sale_qty' => 1, 'sale_weight' => 19.00] ]; $returns = [ ['id' => 13, 'name' => 'Rahul', 'sale_qty' => 1, 'sale_weight' => 8.00], ['id' => 7, 'name' => 'sree', 'sale_qty' => 1, 'sale_weight' => 22.00] ]; // 第一步:将$sales转换为以id为键的关联数组 $processed = []; foreach ($sales as $item) { $processed[$item['id']] = $item; } // 第二步:处理$returns数组 foreach ($returns as $item) { $id = $item['id']; if (isset($processed[$id])) { // 存在重叠ID,执行减法 $processed[$id]['sale_qty'] -= $item['sale_qty']; $processed[$id]['sale_weight'] -= $item['sale_weight']; } else { // 不存在的ID,直接添加 $processed[$id] = $item; } } // 第三步:转换回索引数组(如果需要) $result_array = array_values($processed); // 输出结果 echo "<pre>"; print_r($result_array); echo "</pre>"; ?>
运行结果
这段代码执行后,会得到你预期的结果:
Array ( [0] => Array ( [id] => 13 [name] => Rahul [sale_qty] => 1 [sale_weight] => 30.00 ) [1] => Array ( [id] => 14 [name] => shravandhika [sale_qty] => 1 [sale_weight] => 12.00 ) [2] => Array ( [id] => 3 [name] => veena [sale_qty] => 1 [sale_weight] => 19.00 ) [3] => Array ( [id] => 7 [name] => sree [sale_qty] => 1 [sale_weight] => 22.00 ) )
为什么这个方案更好?
- 效率更高:避免了嵌套循环,时间复杂度从O(n*m)降到O(n+m),数据量大的时候优势明显
- 逻辑清晰:每一步都明确,先处理已有销售数据,再整合退货数据
- 覆盖所有场景:既处理了重叠ID的减法,也保留了两个数组中所有独有的ID
- 变量名准确:严格使用你示例中的
sale_qty和sale_weight,避免了原代码中的变量名错误
内容的提问来源于stack exchange,提问作者code-droid
相关产品推荐
相关产品推荐

