
本文详解如何对嵌套多维数组按 code 字段分组,并对每组内的 product_quantity 进行数值累加,最终生成结构清晰、键值规范的汇总结果。
本文详解如何对嵌套多维数组按 `code` 字段分组,并对每组内的 `product_quantity` 进行数值累加,最终生成结构清晰、键值规范的汇总结果。
在实际 PHP 开发中,常需处理类似销售数据、库存统计等场景:原始数据以多层嵌套结构存储(如按区域 → 商品明细),而业务要求按商品编码(code)聚合数量(product_quantity)。本教程提供健壮、可扩展、零依赖的原生 PHP 实现方案。
核心思路
-
逐层遍历:先遍历外层数组(如
Bertoua Zone 3、Bertoua Zone 1等区域键); -
按 code 归组:对每个区域下的所有子项,以
code为唯一键建立临时聚合映射; -
安全累加:将
product_quantity显式转换为整型(避免字符串拼接),执行累加; -
重构输出结构:将聚合后的关联数组重置为索引数组,确保与目标格式一致(即
0 => [...])。
完整实现代码
<?php
// 原始数据(已简化为标准 PHP 数组,无需 json_decode)
$zone = [
[
'Bertoua Zone 3' => [
['code' => 'BFT50C', 'product_quantity' => '4', 'zone_name' => 'Bertoua Zone 3'],
['code' => 'MNY65C', 'product_quantity' => '10', 'zone_name' => 'Bertoua Zone 3'],
['code' => 'JAP65C', 'product_quantity' => '7', 'zone_name' => 'Bertoua Zone 3'],
['code' => 'MNY65C', 'product_quantity' => '4', 'zone_name' => 'Bertoua Zone 3'],
['code' => 'JAP65C', 'product_quantity' => '3', 'zone_name' => 'Bertoua Zone 3'],
['code' => 'BFT50C', 'product_quantity' => '3', 'zone_name' => 'Bertoua Zone 3'],
['code' => 'JAP65C', 'product_quantity' => '2', 'zone_name' => 'Bertoua Zone 3'],
],
'Bertoua Zone 1' => [
['code' => 'MNY65C', 'product_quantity' => '5', 'zone_name' => 'Bertoua Zone 1'],
['code' => 'JAP65C', 'product_quantity' => '3', 'zone_name' => 'Bertoua Zone 1'],
['code' => 'BFT50C', 'product_quantity' => '7', 'zone_name' => 'Bertoua Zone 1'],
['code' => 'MNY65C', 'product_quantity' => '15', 'zone_name' => 'Bertoua Zone 1'],
['code' => 'JAP65C', 'product_quantity' => '5', 'zone_name' => 'Bertoua Zone 1'],
['code' => 'BFT50C', 'product_quantity' => '4', 'zone_name' => 'Bertoua Zone 1'],
],
]
];
$result = [];
// 遍历最外层数组(通常为单元素,但兼容多组)
foreach ($zone as $groupIndex => $zones) {
$result[$groupIndex] = [];
// 遍历每个 zone(如 'Bertoua Zone 3')
foreach ($zones as $zoneName => $items) {
$aggregated = []; // 按 code 缓存当前 zone 的聚合结果
foreach ($items as $item) {
$code = $item['code'];
$qty = (int)$item['product_quantity']; // 强制转整型,防字符串累加
if (!isset($aggregated[$code])) {
// 首次出现:深拷贝原始结构(保留 zone_name 等字段)
$aggregated[$code] = $item;
$aggregated[$code]['product_quantity'] = $qty;
} else {
// 已存在:仅累加 quantity
$aggregated[$code]['product_quantity'] += $qty;
}
}
// 将关联数组(key=code)转为索引数组,符合目标格式
$result[$groupIndex][$zoneName] = array_values($aggregated);
}
}
// 输出验证
print_r($result);
?>关键注意事项
- ✅ 类型安全:始终使用
(int)或intval()转换product_quantity,避免'10' + '4'得到'104'; - ✅ 结构保真:
array_values()确保结果为数字索引数组(而非code作为键),严格匹配示例输出; - ⚠️ 嵌套层级适配:本例假设
$zone是单元素数组($zone[0]),若有多组区域批次,循环foreach ($zone as $groupIndex => ...)可自然扩展; - ? 避免引用陷阱:不使用
&$item修改原数组,确保数据隔离性; - ? 可拓展建议:如需支持多字段聚合(如同时 sum
product_quantity和price),只需在$aggregated[$code]中增加对应累加逻辑。
该方案简洁高效,无第三方库依赖,适用于 PHP 7.0+,可直接集成至 Laravel、Symfony 或原生项目的数据处理层。



















