
本文详解如何将包含日期字符串的数组按年份(如 2021、2022)高效分组,生成以年份为键、对应对象数组为值的嵌套结构,支持 php 和 javascript 双实现,代码简洁可靠,适用于日志归档、数据统计等场景。
本文详解如何将包含日期字符串的数组按年份(如 2021、2022)高效分组,生成以年份为键、对应对象数组为值的嵌套结构,支持 php 和 javascript 双实现,代码简洁可靠,适用于日志归档、数据统计等场景。
在实际开发中,常需将时间序列数据(如文章、订单、日志)按年份归类展示或处理。给定一个含 "date": "MM/DD/YYYY" 格式字符串的 JSON 数组,目标是将其重组为以年份为键、同年内所有对象为值的关联数组(PHP)或普通对象(JavaScript),且结果需保持原始数据完整性。
✅ JavaScript 实现(推荐用于前端或 Node.js)
利用 substring(6) 快速提取日期末尾 4 位年份(兼容 MM/DD/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(obj => {
const year = obj.date.substring(6); // 提取 "2022" 或 "2021"
if (!output[year]) output[year] = [];
output[year].push(obj);
});
console.log(output);
// 输出:
// {
// "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) 前提是日期格式严格为 MM/DD/YYYY(共10字符,年份始终位于索引6–9)。若存在 YYYY-MM-DD 或不规范格式,建议改用 new Date(obj.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); // 取第7位起4个字符 → "2021"
if (!array_key_exists($year, $output)) {
$output[$year] = [];
}
$output[$year][] = $item;
}
print_r($output);
?>
输出结构为标准 PHP 关联数组,可直接 json_encode($output) 返回给前端,或用于后续业务逻辑(如按年导出 CSV)。
? 补充说明与最佳实践
- 排序需求:题目要求“按年份升序”,上述方案未自动排序。若需输出键按 2021, 2022 顺序排列,PHP 可追加 ksort($output);JavaScript 可用 Object.fromEntries(Object.entries(output).sort())。
- 日期健壮性:生产环境建议统一解析日期,例如 PHP 使用 date('Y', strtotime($item['date'])),JS 使用 new Date(item.date).getFullYear(),避免因格式偏差导致年份提取错误。
- 性能考量:该算法时间复杂度为 O(n),空间复杂度 O(n),适用于万级以内数据;超大数据量建议结合数据库 GROUP BY YEAR(date) 原生聚合。
掌握这一分组模式,你便能灵活应对博客归档、财务年报、用户行为分析等典型时间维度聚合需求。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











