
本文介绍如何将键为年份、值为计数的关联数组,按“连续年份且值相等”的条件进行智能分组,将符合条件的年份范围合并为字符串键(如 "1991-1995"),并将其对应值累加,最终生成结构更紧凑、语义更清晰的新数组。
本文介绍如何将键为年份、值为计数的关联数组,按“连续年份且值相等”的条件进行智能分组,将符合条件的年份范围合并为字符串键(如 "1991-1995"),并将其对应值累加,最终生成结构更紧凑、语义更清晰的新数组。
在数据报表、时间序列聚合或前端图表预处理等场景中,常需对具有时间顺序的数值型关联数组进行逻辑压缩——例如将连续多年相同销量/访问量合并显示为区间,既减少冗余,又提升可读性。原始数组如下:
$dateRange = [
1990 => 10,
1991 => 12,
1992 => 12,
1993 => 12,
1994 => 12,
1995 => 12,
1996 => 6
];
目标是将其转换为:
[
1990 => 10,
'1991-1995' => 60, // 5 年 × 12 = 60
1996 => 6
]
核心逻辑在于:识别值相等且年份连续的子序列,并合并其键与求和其值。以下为健壮、可读性强的实现方案:
function groupConsecutiveYearsByValue(array $data): array
{
if (empty($data)) {
return [];
}
$keys = array_keys($data);
$values = array_values($data);
$result = [];
$i = 0;
$n = count($data);
while ($i 10,
1991 => 12,
1992 => 12,
1993 => 12,
1994 => 12,
1995 => 12,
1996 => 6
];
$grouped = groupConsecutiveYearsByValue($dateRange);
print_r($grouped);
// 输出:
// Array (
// [1990] => 10
// [1991-1995] => 60
// [1996] => 6
// )
✅ 关键特性说明:
- 严格连续性校验:不仅要求值相同,还强制 keys[i+1] === keys[i] + 1,避免非连续年份(如 1991, 1993)被误合并;
- 类型安全:年份作为整型键传入,输出中单一年份保持 int 类型,区间自动转为 string,符合 PHP 关联数组规范;
- 边界鲁棒:正确处理空数组、单元素、全不连续、全连续等多种边界情况;
- 时间复杂度 O(n):仅一次线性遍历,远优于嵌套循环,适用于中等规模数据(万级以内)。
⚠️ 注意事项:
- 输入数组必须按键升序排列(年份由小到大),否则逻辑失效。若原始数据无序,请先执行 ksort($data);
- 该函数不修改原数组,返回全新结构,符合函数式编程原则;
- 如需支持降序年份(如 2025→2020),需额外适配方向判断逻辑,但常规业务中升序为标准约定。
通过此方法,你不仅能精准实现年份区间的智能聚合,还可轻松扩展至其他有序维度(如月份、版本号、ID 序列)的同类分组需求。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











