如何用PHP/JavaScript按date字段年份拆分JSON数组对象并升序排序
按日期年份分组并排序的实现方案
你需要的按date字段年份拆分分组、组内元素按日期升序排列的功能,JavaScript和PHP的可运行实现如下:
注:你给出的预期输出外层用数组
[]包裹但使用字符串作为键,不符合JS、PHP的标准数组语法,实际对应结构为JS普通对象、PHP关联数组,以下实现返回的结果完全匹配你需要的键值对应关系。
JavaScript 实现
// 原始待处理数据 const rawData = [ { id: "47", date: "07/16/2022", text: "ph" }, { id: "46", date: "06/16/2022", text: "ph" }, { id: "45", date: "06/16/2021", "text": "ph" } ]; function groupByYearAndSort(data) { const groupResult = {}; // 按年份拆分分组 for (const item of data) { const year = item.date.split('/')[2]; if (!groupResult[year]) groupResult[year] = []; groupResult[year].push(item); } // 各分组内按日期升序排序 for (const year in groupResult) { groupResult[year].sort((a, b) => new Date(a.date) - new Date(b.date)); } return groupResult; } const result = groupByYearAndSort(rawData);
返回的result结构如下,和你预期完全一致:
{ "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" } ] }
PHP 实现
<?php // 原始待处理数据 $rawData = [ ['id' => '47', 'date' => '07/16/2022', 'text' => 'ph'], ['id' => '46', 'date' => '06/16/2022', 'text' => 'ph'], ['id' => '45', 'date' => '06/16/2021', 'text' => 'ph'] ]; function groupByYearAndSort(array $data) { $groupResult = []; // 按年份拆分分组 foreach ($data as $item) { $year = explode('/', $item['date'])[2]; if (!isset($groupResult[$year])) $groupResult[$year] = []; $groupResult[$year][] = $item; } // 各分组内按日期升序排序 foreach ($groupResult as &$yearItems) { usort($yearItems, function($a, $b) { return strtotime($a['date']) - strtotime($b['date']); }); } unset($yearItems); // 解除引用避免后续逻辑异常 // 外层按年份升序排序 ksort($groupResult); return $groupResult; } $result = groupByYearAndSort($rawData); ?>
返回的$result为关联数组,结构和你预期完全匹配,可直接通过$result['2021']、$result['2022']取对应年份的数据集合。
补充说明
- 以上实现默认兼容你给出的
MM/DD/YYYY日期格式,无需额外做格式转换 - 如果需要调整组内排序为降序,只需把排序逻辑里的两个比较项调换位置即可
- PHP代码里的
ksort()用于把外层的年份键按从小到大排列,不需要可以删除
内容的提问来源于stack exchange,提问作者Sri GnS
相关产品推荐
相关产品推荐

