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

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);
?>

逻辑说明:

  1. 遍历原始数组时,用id_gudang和id_receiver拼接成唯一的键(这里用|做分隔符,比下划线更安全,避免ID本身含下划线导致键冲突);
  2. 检查临时数组中是否存在这个键:存在就累加价格,不存在就把当前项存入;
  3. 最后用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:41:08