PHP中按id_gudang和id_receiver分组求和多维数组price值
如何对PHP多维数组中相同id_gudang和id_receiver的price值求和?
嘿,这个需求我经常碰到,给你两种实用的实现方式,都能完美达到你的要求:
方法一:遍历数组+临时存储(最直观易读)
这种方式逻辑清晰,新手也能轻松理解,核心是用唯一组合键来区分不同的id_gudang+id_receiver配对:
<?php $data = [ ['id_gudang' => 69, 'id_receiver' => 121, 'price' => 1], ['id_gudang' => 69, 'id_receiver' => 121, 'price' => 3], ['id_gudang' => 71, 'id_receiver' => 134, 'price' => 7], ['id_gudang' => 72, 'id_receiver' => 135, 'price' => 3], ['id_gudang' => 72, 'id_receiver' => 216, 'price' => 5], ['id_gudang' => 72, 'id_receiver' => 216, 'price' => 5] ]; // 用临时数组存储累加后的结果 $temp = []; foreach ($data as $item) { // 拼接唯一键:用不会出现在ID里的字符分隔,避免冲突 $key = $item['id_gudang'] . '|' . $item['id_receiver']; if (isset($temp[$key])) { // 已存在该组合,累加price $temp[$key]['price'] += $item['price']; } else { // 首次出现该组合,直接存入临时数组 $temp[$key] = $item; } } // 把关联数组转成索引数组,得到最终结果 $new_data = array_values($temp); print_r($new_data); ?>
逻辑说明:
- 遍历原始数组时,用
id_gudang和id_receiver拼接成唯一的键(这里用|做分隔符,比下划线更安全,避免ID本身含下划线导致键冲突); - 检查临时数组中是否存在这个键:存在就累加价格,不存在就把当前项存入;
- 最后用
array_values()把临时数组的关联键去掉,转换成你需要的索引数组格式。
方法二:用array_reduce函数(更简洁的函数式写法)
如果你喜欢更简洁的代码,可以用PHP的array_reduce函数来实现,本质逻辑和方法一完全一致,只是写法更紧凑:
<?php $data = [ ['id_gudang' => 69, 'id_receiver' => 121, 'price' => 1], ['id_gudang' => 69, 'id_receiver' => 121, 'price' => 3], ['id_gudang' => 71, 'id_receiver' => 134, 'price' => 7], ['id_gudang' => 72, 'id_receiver' => 135, 'price' => 3], ['id_gudang' => 72, 'id_receiver' => 216, 'price' => 5], ['id_gudang' => 72, 'id_receiver' => 216, 'price' => 5] ]; $new_data = array_values(array_reduce($data, function ($carry, $item) { $key = $item['id_gudang'] . '|' . $item['id_receiver']; if (isset($carry[$key])) { $carry[$key]['price'] += $item['price']; } else { $carry[$key] = $item; } return $carry; }, [])); print_r($new_data); ?>
逻辑说明:
array_reduce会迭代原始数组,把每一项逐步合并到$carry(累加器)中,我们在回调函数里完成和方法一相同的键判断与价格累加,最后同样用array_values()转换数组格式。
两种方法运行后,都会得到你期望的$new_data数组哦~
内容的提问来源于stack exchange,提问作者rifqi shiddiq
相关产品推荐
相关产品推荐

