
本文详解如何在 PHP 中对嵌套多维数组按 code 字段分组,并对 product_quantity 进行数值累加,同时保留原始结构层级与 zone_name 信息。
本文详解如何在 php 中对嵌套多维数组按 `code` 字段分组,并对 `product_quantity` 进行数值累加,同时保留原始结构层级与 `zone_name` 信息。
在实际业务开发中(如库存汇总、销售分区统计),我们常需处理类似结构的嵌套数据:外层按区域(如 'Bertoua Zone 3')组织,内层为明细记录,目标是按 code 归并同类项,并将 product_quantity 字符串转为整数后求和。关键挑战在于:保持原有“区域 → 记录列表”两级结构、避免重复键覆盖、正确类型转换(字符串 '7' 需转为 int 后累加)。
以下是一个健壮、可复用的解决方案:
function groupAndSumByCode(array $data): array
{
$result = [];
// 遍历最外层数组(通常为单元素,但兼容多组)
foreach ($data as $zoneGroup) {
// 遍历每个 zone 名称及其对应的数据数组
foreach ($zoneGroup as $zoneName => $records) {
$grouped = [];
$codeCounts = []; // 用于暂存各 code 的累计值
foreach ($records as $record) {
$code = $record['code'] ?? '';
$quantity = (int)$record['product_quantity']; // 强制转整型,安全处理空/非法值
$zoneName = $record['zone_name'] ?? $zoneName;
if (!isset($codeCounts[$code])) {
$codeCounts[$code] = 0;
// 初始化首条记录(保留 zone_name 和其他字段,仅 quantity 待更新)
$grouped[$code] = [
'code' => $code,
'product_quantity' => 0,
'zone_name' => $zoneName,
];
}
$codeCounts[$code] += $quantity;
}
// 将累计结果写入 grouped 数组,并重索引为数字键
$finalZoneData = [];
foreach ($codeCounts as $code => $sum) {
$grouped[$code]['product_quantity'] = $sum;
$finalZoneData[] = $grouped[$code];
}
// 按 zoneName 写入结果(保持原始键名)
$result[0][$zoneName] = $finalZoneData;
}
}
return $result;
}
// 使用示例
$recapByZone = groupAndSumByCode($zone);
print_r($recapByZone);
✅ 核心要点说明:
-
类型安全:使用
(int)强制转换确保'4' + '3'得到7而非字符串拼接'43'; -
结构保真:输出严格匹配目标格式——外层数组含索引
0,内部以 zone 名为键,值为按code去重+求和后的数值数组; -
容错设计:通过
??操作符防御code或zone_name缺失字段,避免 Notice 报错; -
可扩展性:函数封装便于复用,如需按其他字段(如
category)分组,只需调整$record['code']即可。
⚠️ 注意事项:
- 若原始数据中
product_quantity可能含小数(如'3.5'),应改用(float)转换并注意浮点精度问题; - 大数据量场景下,建议在数据库层完成
GROUP BY code, zone_name SUM(product_quantity),PHP 层仅作轻量聚合; - 该逻辑不改变原始
$zone数组,符合函数式编程原则。
通过此方法,你可高效、清晰地完成多维嵌套数据的分组聚合任务,兼顾可读性、健壮性与生产可用性。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











