
本文详解如何在 php 中对多维关联数组按多个字段(如 category 和 period)组合分组,并对目标数值字段(如 depreciation)执行求和,最终返回结构一致的聚合结果。
本文详解如何在 php 中对多维关联数组按多个字段(如 category 和 period)组合分组,并对目标数值字段(如 depreciation)执行求和,最终返回结构一致的聚合结果。
在实际业务开发中(如财务折旧统计、销售数据汇总等),我们常需对二维关联数组按多个维度联合分组,并对某数值字段进行聚合计算。与单列分组不同,多列分组的关键在于构造唯一性分组键(grouping key)。本文以 category 和 period 为联合分组依据、depreciation 为求和字段为例,提供清晰、健壮且可复用的实现方案。
核心思路:基于复合键的聚合映射
PHP 数组天然支持字符串键,因此最简洁高效的方式是将多个分组字段拼接成一个唯一字符串键(例如 "Machines__2022-07"),以此作为临时聚合容器的索引。该策略避免了嵌套循环或第三方扩展依赖,兼容 PHP 7.4+(利用空合并赋值 ??= 简化初始化逻辑)。
以下为完整可运行示例:
<?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) {
// 构造唯一分组键:使用双下划线防止单词冲突(如 "A_B" + "C" vs "A" + "B_C")
$key = $row['category'] . '__' . $row['period'];
// 若该键首次出现,则初始化聚合项(保留原始非数值字段,depreciation 归零)
$sums[$key] ??= [
'category' => $row['category'],
'period' => $row['period'],
'depreciation' => 0,
];
// 累加 depreciation 值(PHP 自动类型转换,支持字符串数字)
$sums[$key]['depreciation'] += $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)拼接字段,避免因字段内容含 - 或 , 导致键冲突。若数据来源不可控,可改用 sha1($cat . '|' . $period) 生成哈希键。
- 类型安全:depreciation 字段若含非数字字符串(如 "N/A"),需提前过滤或使用 is_numeric() 校验,否则加法可能产生意外结果(如 "100" + "N/A" → 100)。
- 性能考量:该算法时间复杂度为 O(n),空间复杂度为 O(k)(k 为唯一分组数),适用于万级以内数据;超大数据集建议移交数据库(GROUP BY category, period SUM(depreciation))处理。
-
扩展性提示:如需支持动态分组字段或多种聚合方式(max/min/avg),可封装为函数:
function groupSum(array $data, array $groupKeys, string $sumKey): array { $result = []; foreach ($data as $row) { $key = implode('__', array_map(fn($k) => $row[$k], $groupKeys)); $result[$key] ??= array_merge( array_intersect_key($row, array_flip($groupKeys)), [$sumKey => 0] ); $result[$key][$sumKey] += $row[$sumKey]; } return array_values($result); } // 使用:groupSum($data, ['category', 'period'], 'depreciation');
通过合理设计分组键与初始化逻辑,PHP 原生数组即可高效完成多维聚合任务——无需额外依赖,语义清晰,易于维护。











