PHP多维数组按code字段分组并汇总product_quantity字段
PHP数组按code分组并汇总product_quantity字段值
我们需要处理一个嵌套的PHP数组,针对每个区域内的产品数据,按照code字段进行分组,并将每组内的product_quantity值求和汇总,最终得到每个区域下各code对应总数量的数组。
原数组
$zone = array ( 0 => array ( 'Bertoua Zone 3' => array ( 0 => array ( 'code' => 'BFT50C', 'product_quantity' => '4', 'zone_name' => 'Bertoua Zone 3', ), 1 => array ( 'code' => 'MNY65C', 'product_quantity' => '10', 'zone_name' => 'Bertoua Zone 3', ), 2 => array ( 'code' => 'JAP65C', 'product_quantity' => '7', 'zone_name' => 'Bertoua Zone 3', ), 3 => array ( 'code' => 'MNY65C', 'product_quantity' => '4', 'zone_name' => 'Bertoua Zone 3', ), 4 => array ( 'code' => 'JAP65C', 'product_quantity' => '3', 'zone_name' => 'Bertoua Zone 3', ), 5 => array ( 'code' => 'BFT50C', 'product_quantity' => '3', 'zone_name' => 'Bertoua Zone 3', ), 6 => array ( 'code' => 'JAP65C', 'product_quantity' => '2', 'zone_name' => 'Bertoua Zone 3', ), ), 'Bertoua Zone 1' => array ( 0 => array ( 'code' => 'MNY65C', 'product_quantity' => '5', 'zone_name' => 'Bertoua Zone 1', ), 1 => array ( 'code' => 'JAP65C', 'product_quantity' => '3', 'zone_name' => 'Bertoua Zone 1', ), 2 => array ( 'code' => 'BFT50C', 'product_quantity' => '7', 'zone_name' => 'Bertoua Zone 1', ), 3 => array ( 'code' => 'MNY65C', 'product_quantity' => '15', 'zone_name' => 'Bertoua Zone 1', ), 4 => array ( 'code' => 'JAP65C', 'product_quantity' => '5', 'zone_name' => 'Bertoua Zone 1', ), 5 => array ( 'code' => 'BFT50C', 'product_quantity' => '4', 'zone_name' => 'Bertoua Zone 1', ), ), ), );
期望结果数组
$recapByZone = array ( 0 => array ( 'Bertoua Zone 3' => array ( 0 => array ( 'code' => 'BFT50C', 'product_quantity' => 7, 'zone_name' => 'Bertoua Zone 3', ), 1 => array ( 'code' => 'MNY65C', 'product_quantity' => 14, 'zone_name' => 'Bertoua Zone 3', ), 2 => array ( 'code' => 'JAP65C', 'product_quantity' => 12, 'zone_name' => 'Bertoua Zone 3', ), ), 'Bertoua Zone 1' => array ( 0 => array ( 'code' => 'MNY65C', 'product_quantity' => 20, 'zone_name' => 'Bertoua Zone 1', ), 1 => array ( 'code' => 'JAP65C', 'product_quantity' => 8, 'zone_name' => 'Bertoua Zone 1', ), 2 => array ( 'code' => 'BFT50C', 'product_quantity' => 11, 'zone_name' => 'Bertoua Zone 1', ), ), ), );
实现代码
$recapByZone = []; // 遍历外层的区域集合 foreach ($zone as $areaSet) { $processedArea = []; // 逐个处理每个区域 foreach ($areaSet as $zoneName => $products) { $sumByCode = []; // 遍历区域内的所有产品 foreach ($products as $product) { $code = $product['code']; // 将字符串类型的数量转为整数 $quantity = (int)$product['product_quantity']; // 累加对应code的数量 if (isset($sumByCode[$code])) { $sumByCode[$code]['product_quantity'] += $quantity; } else { $sumByCode[$code] = [ 'code' => $code, 'product_quantity' => $quantity, 'zone_name' => $zoneName ]; } } // 将关联数组转为索引数组,匹配期望格式 $processedArea[$zoneName] = array_values($sumByCode); } $recapByZone[] = $processedArea; } // 打印结果 print_r($recapByZone);
代码逻辑说明
- 初始化结果数组用于存储最终处理后的数据;
- 逐层遍历原数组的嵌套结构,先处理外层的区域集合,再逐个处理每个区域;
- 对每个区域内的产品,以
code为键创建临时数组,累加对应产品的数量(注意将字符串转为整数避免字符串拼接); - 每个区域处理完成后,将临时的关联数组转为索引数组,保证格式与期望结果一致;
- 最终将处理好的区域数据存入结果数组。
内容的提问来源于stack exchange,提问作者Mickey101987
相关产品推荐
相关产品推荐

