
本文详解如何将包含日期字符串(如 "07/16/2022")的数组,按年份键(如 "2022")分组聚合为关联数组或对象,支持 php 和 javascript 双实现,并确保结果按年份升序组织、结构清晰可扩展。
本文详解如何将包含日期字符串(如 "07/16/2022")的数组,按年份键(如 "2022")分组聚合为关联数组或对象,支持 php 和 javascript 双实现,并确保结果按年份升序组织、结构清晰可扩展。
在实际开发中,常需对时间序列数据(如日志、文章、订单)按年份归类展示。原始数据中日期多以 MM/DD/YYYY 格式存储于字符串字段,需提取年份并重组为以年为键、对应条目为值数组的结构。以下提供两种主流语言的高效、健壮实现方案。
✅ JavaScript 实现(适用于浏览器或 Node.js)
利用 substring(6) 直接截取日期字符串末 4 位作为年份(假设格式严格为 XX/XX/YYYY),再通过对象动态构建分组:
const input = [
{ "id": "47", "date": "07/16/2022", "text": "ph" },
{ "id": "46", "date": "06/16/2022", "text": "ph" },
{ "id": "45", "date": "06/16/2021", "text": "ph" }
];
const output = {};
input.forEach(item => {
const year = item.date.substring(6); // 安全提取年份(索引6起4字符)
if (!output[year]) output[year] = [];
output[year].push(item);
});
// 若需按年份升序返回键值对(如用于渲染),可后续排序:
const sortedOutput = Object.fromEntries(
Object.entries(output).sort(([a], [b]) => a - b)
);
console.log(sortedOutput);
// 输出:
// {
// "2021": [{ "id": "45", "date": "06/16/2021", "text": "ph" }],
// "2022": [
// { "id": "46", "date": "06/16/2022", "text": "ph" },
// { "id": "47", "date": "07/16/2022", "text": "ph" }
// ]
// }
⚠️ 注意:substring(6) 依赖固定格式。若日期格式不统一(如含 YYYY-MM-DD),建议改用 new Date(item.date).getFullYear() 做兼容性解析。
✅ PHP 实现(适用于服务端数据处理)
PHP 中使用 substr($date, 6) 同理提取年份,并借助关联数组天然支持键名索引:
<?php $input = [
['id' => '47', 'date' => '07/16/2022', 'text' => 'ph'],
['id' => '46', 'date' => '06/16/2022', 'text' => 'ph'],
['id' => '45', 'date' => '06/16/2021', 'text' => 'ph']
];
$output = [];
foreach ($input as $item) {
$year = substr($item['date'], 6); // 提取年份
if (!isset($output[$year])) {
$output[$year] = [];
}
$output[$year][] = $item;
}
// 按年份升序排序键(确保输出有序)
ksort($output, SORT_NUMERIC);
print_r($output);
// 输出:
// Array (
// [2021] => Array ( ... )
// [2022] => Array ( ... )
// )
?>
? 提示:ksort($output, SORT_NUMERIC) 确保年份键按数字大小升序排列(避免字符串排序导致 "1000" 排在 "2021" 前)。若需转为 JSON 输出,直接 json_encode($output, JSON_UNESCAPED_UNICODE) 即可。
? 总结与最佳实践
- 核心逻辑一致:遍历 → 提取年份 → 动态初始化分组数组 → 追加元素;
-
健壮性增强建议:
- 对日期字段做空值/格式校验(如 !empty($item['date']) && preg_match('/^\d{1,2}\/\d{1,2}\/\d{4}$/', $item['date']));
- 使用 DateTime::createFromFormat()(PHP)或 Date.parse()(JS)替代硬切片,提升格式容错能力;
- 性能考量:该算法时间复杂度为 O(n),适用于万级以内数据;超大数据集可考虑流式处理或数据库 GROUP BY YEAR(date) 预聚合。
掌握此模式后,可轻松扩展至按“年-月”、“季度”甚至自定义时间范围分组,是构建时间维度数据看板的基础技能。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











