
本文介绍如何将关联数组中具有相同值的连续年份键(如1991–1995)自动合并为区间键,并将其对应值累加,从而精简数据结构、提升可读性与后续处理效率。
本文介绍如何将关联数组中具有相同值的连续年份键(如1991–1995)自动合并为区间键,并将其对应值累加,从而精简数据结构、提升可读性与后续处理效率。
在数据聚合与报表生成场景中,常需对时间序列数据进行逻辑分组——例如,将连续多年保持相同统计值(如销量、访问量)的年份压缩为“起始-结束”区间,并汇总其总量。本教程提供一种健壮、清晰且可复用的 PHP 实现方案,适用于任意有序整数键(如年份)与标量值的关联数组。
核心思路
遍历原数组,识别值相等且键为连续整数的子序列;对每个符合条件的连续段,记录起始年份($start)、结束年份($end)及累计和($sum);非连续或值变化处则立即输出前一段(或单一年份),再重置状态。
推荐实现(修正原始逻辑缺陷,增强鲁棒性)
<?php $dateRange = [
1990 => 10,
1991 => 12,
1992 => 12,
1993 => 12,
1994 => 12,
1995 => 12,
1996 => 6
];
$result = [];
$keys = array_keys($dateRange);
$values = array_values($dateRange);
$len = count($keys);
if ($len === 0) {
$result = [];
} else {
$i = 0;
while ($i 10
// [1991-1995] => 60
// [1996] => 6
// )
关键注意事项
- ✅ 键必须严格有序且为连续整数:算法依赖 array_keys() 返回顺序与数值连续性。若原始数组键无序,请先 ksort($dateRange)。
- ✅ 值比较使用全等(===):避免类型隐式转换导致误判(如字符串 "12" 与整数 12)。
- ⚠️ 不支持非数值键或跳跃年份:如 [1990=>10, 1992=>12] 中 1992 不会与 1991 合并(因缺少 1991 键)。
- ? 可扩展性提示:如需支持月度("2023-01")或季度格式,可将键解析逻辑封装为独立函数,统一提取可比较的时间戳。
总结
该方案以线性时间复杂度 O(n) 高效完成分组与聚合,代码简洁、边界清晰,无需额外扩展库。它不仅解决了示例中的年份合并需求,其设计思想(滑动窗口式连续段识别)亦可迁移至日志分析、时序压缩、UI 展示优化等广泛场景。










