
本文详解如何在 php 中对多维关联数组按多个字段(如 category 和 period)组合分组,并对指定数值字段(如 depreciation)执行聚合求和,最终输出结构清晰、键值规范的汇总数组。
本文详解如何在 php 中对多维关联数组按多个字段(如 category 和 period)组合分组,并对指定数值字段(如 depreciation)执行聚合求和,最终输出结构清晰、键值规范的汇总数组。
在实际业务开发中(如财务折旧统计、销售数据汇总等),我们常需对二维关联数组按多个维度联合分组,并对某一数值列进行求和。与单列分组不同,多列分组的关键在于构造唯一复合键(composite key),以准确识别逻辑上相同的分组单元。
核心思路:用复合键驱动分组聚合
最简洁可靠的方式是将参与分组的字段(如 'category' 和 'period')拼接为一个字符串键(例如 "Machines__2022-07"),作为临时分组标识。该键用于索引中间汇总数组,确保相同类别与周期的数据被归入同一槽位。
以下为完整可运行示例:
<?php
$data = [
['category' => 'Tools, furniture & fixtures', 'period' => '2022-07', 'depreciation' => 100],
['category' => 'Tools, furniture & fixtures', 'period' => '2022-07', 'depreciation' => 50],
['category' => 'Machines', 'period' => '2022-07', 'depreciation' => 25],
['category' => 'Machines', 'period' => '2022-07', 'depreciation' => 75],
['category' => 'Machines', 'period' => '2022-08', 'depreciation' => 200],
];
$sums = [];
foreach ($data as $row) {
// 构造唯一复合键:使用双下划线避免字段值内含分隔符导致冲突
$key = $row['category'] . '__' . $row['period'];
// 若该分组首次出现,则初始化结构(保留非数值字段原始值)
if (!isset($sums[$key])) {
$sums[$key] = [
'category' => $row['category'],
'period' => $row['period'],
'depreciation' => 0,
];
}
// 累加 depreciation(自动类型转换兼容字符串数字)
$sums[$key]['depreciation'] += (float)$row['depreciation'];
}
// 转换为连续数字索引数组,符合常规输出预期
$result = array_values($sums);
print_r($result);
?>输出结果:
立即学习“PHP免费学习笔记(深入)”;
Array
(
[0] => Array
(
[category] => Tools, furniture & fixtures
[period] => 2022-07
[depreciation] => 150
)
[1] => Array
(
[category] => Machines
[period] => 2022-07
[depreciation] => 100
)
[2] => Array
(
[category] => Machines
[period] => 2022-08
[depreciation] => 200
)
)关键注意事项
- ✅ 键分隔符选择:推荐使用 __、| 或 \0 等低概率出现在业务字段中的字符。避免用 - 或 ,,以防 category 或 period 值本身含该字符导致哈希碰撞。
- ✅ 类型安全处理:$row['depreciation'] 可能为字符串,显式转为 (float) 或 (int) 更健壮;PHP 虽会自动类型提升,但明确转换可防止隐式错误。
- ✅ 空值/缺失字段防护:生产环境建议增加 isset() 或 array_key_exists() 判断,例如:
if (!isset($row['category']) || !isset($row['period']) || !isset($row['depreciation'])) { continue; // 或抛出异常/记录日志 } - ⚠️ 性能提示:该算法时间复杂度为 O(n),空间复杂度为 O(k)(k 为唯一分组数),适用于万级以内数据;超大数据集建议改用数据库 GROUP BY category, period SUM(depreciation)。
总结
PHP 原生数组多列分组求和无需依赖外部库——核心在于用复合键替代单键逻辑,配合 isset() 或空合并操作符 ??= 初始化分组结构。掌握此模式后,可轻松扩展至三列及以上分组(如 cat__period__region),亦可替换为 array_reduce() 实现函数式写法。记住:清晰的键设计 + 结构化初始化 + 类型安全累加 = 可靠的聚合结果。











