PHP中合并多数组相同variant_id的quantity与price的方法
合并PHP数组中相同variant_id的条目(累加quantity,保留price)
需求说明
你需要将多个子数组中相同variant_id的条目合并:
- 相同
variant_id对应的quantity进行累加 price保持与原条目一致(假设同一variant_id的price都是相同的,如你的示例数据)
输入示例
$inputArray = Array ( [0] => Array ( [variant_id] => 30929149493321 [quantity] => 1 [price] => 299.00 ), [1] => Array ( [variant_id] => 19663805153353 [quantity] => 1 [price] => 99.00 ), [2] => Array ( [variant_id] => 19663804989513 [quantity] => 6 [price] => 99.00 ), [3] => Array ( [variant_id] => 30929149493321 [quantity] => 1 [price] => 299.00 ), [4] => Array ( [variant_id] => 19663805153353 [quantity] => 1 [price] => 99.00 ), [5] => Array ( [variant_id] => 31108834754633 [quantity] => 1 [price] => 379.05 ) );
期望输出
Array ( [0] => Array ( [variant_id] => 30929149493321 [quantity] => 2 [price] => 299.00 ), [1] => Array ( [variant_id] => 19663805153353 [quantity] => 2 [price] => 99.00 ), [2] => Array ( [variant_id] => 19663804989513 [quantity] => 6 [price] => 99.00 ), [3] => Array ( [variant_id] => 31108834754633 [quantity] => 1 [price] => 379.05 ) );
解决方案代码
这里用一个高效的循环实现,利用variant_id作为临时数组的键来快速判断重复:
// 你的原始输入数组 $inputArray = [ ['variant_id' => 30929149493321, 'quantity' => 1, 'price' => 299.00], ['variant_id' => 19663805153353, 'quantity' => 1, 'price' => 99.00], ['variant_id' => 19663804989513, 'quantity' => 6, 'price' => 99.00], ['variant_id' => 30929149493321, 'quantity' => 1, 'price' => 299.00], ['variant_id' => 19663805153353, 'quantity' => 1, 'price' => 99.00], ['variant_id' => 31108834754633, 'quantity' => 1, 'price' => 379.05], ]; $mergedArray = []; foreach ($inputArray as $item) { $id = $item['variant_id']; // 如果当前variant_id已存在,累加quantity if (isset($mergedArray[$id])) { $mergedArray[$id]['quantity'] += $item['quantity']; } else { // 不存在则直接添加条目,用variant_id作为临时键 $mergedArray[$id] = $item; } } // 将关联数组转为数字索引数组,匹配期望输出格式 $mergedArray = array_values($mergedArray); // 打印结果 print_r($mergedArray);
代码说明
- 临时数组键的使用:用
variant_id作为$mergedArray的键,这样可以在O(1)时间内判断该条目是否已存在,避免嵌套循环,提升效率。 - 累加逻辑:如果条目已存在,只需要对
quantity进行累加操作,price因为同一variant_id值一致,无需修改。 - 索引重置:最后用
array_values()将关联数组转换为数字索引数组,和你期望的输出格式完全匹配。
内容的提问来源于stack exchange,提问作者Muneeb Ahmad
相关产品推荐
相关产品推荐

