如何合并数组中model与color匹配项并累加qty值?
合并数组中同型号同颜色项并累加数量的实现方法
嘿,这个需求在日常开发里挺常见的,我给你分享两种PHP里靠谱的实现方式,都能完美达成你的目标:
首先先明确你的原始数组:
$originalArray = [ ['model' => 'MX555', 'color' => 'RED', 'qty' => 2], ['model' => 'MX555', 'color' => 'RED', 'qty' => 2], ['model' => 'MX555', 'color' => 'Green', 'qty' => 2], ['model' => 'MX555', 'color' => 'Green', 'qty' => 1], ];
方法一:利用临时数组的复合键分组累加
这是最直观高效的方式,核心思路是用model和color的组合作为唯一标识,遍历数组时做累加:
$mergedArray = []; foreach ($originalArray as $item) { // 用model+特殊分隔符+color生成唯一键,避免重复 $key = $item['model'] . '|' . $item['color']; if (isset($mergedArray[$key])) { // 已存在则累加数量 $mergedArray[$key]['qty'] += $item['qty']; } else { // 不存在则直接存入临时数组 $mergedArray[$key] = $item; } } // 把关联数组转为索引数组,得到目标格式 $mergedArray = array_values($mergedArray); print_r($mergedArray);
这里我用|作为分隔符,比下划线更安全——如果你的model或color本身包含下划线,用下划线会导致键冲突,|一般不会出现在这类字段里,当然你也可以用serialize([$item['model'], $item['color']])来生成绝对唯一的键。
方法二:使用array_reduce进行函数式聚合
如果你更喜欢函数式编程的写法,array_reduce是个不错的选择,逻辑和第一种方法一致,但代码更简洁:
$mergedArray = array_reduce($originalArray, function($carry, $item) { $key = $item['model'] . '|' . $item['color']; if (isset($carry[$key])) { $carry[$key]['qty'] += $item['qty']; } else { $carry[$key] = $item; } return $carry; }, []); // 同样转成索引数组 $mergedArray = array_values($mergedArray); print_r($mergedArray);
array_reduce会迭代原始数组,把每一项逐步合并到$carry(也就是我们的临时数组)里,最后返回合并后的结果。
两种方法运行后都会得到正确的合并数组:
Array ( [0] => Array ( [model] => MX555 [color] => RED [qty] => 4 ) [1] => Array ( [model] => MX555 [color] => Green [qty] => 3 ) )
哦对了,你目标里Green的qty写的是4,但原始数组里是2+1=3,应该是笔误吧?代码里会正确计算成3哦~
内容的提问来源于stack exchange,提问作者suman das
相关产品推荐
相关产品推荐

