如何按时间顺序排序含多字段JSON文件的start日期?选sort()/usort()/asort()?
如何按start日期对JSON数据排序及函数选择
要实现按start日期排序,你需要选择usort()函数,另外两个函数并不适用,原因如下:
sort():仅适用于简单索引数组,会重置键名,且只能使用默认规则排序,无法处理需要自定义逻辑的日期排序场景。asort():会保留原关联键,但同样只能按值的默认比较规则排序,无法处理日期字符串的转换比较。usort():允许自定义排序逻辑,正好满足按start字段的日期顺序排序的需求。
实现步骤与代码示例
- 解析JSON为PHP数组:用
json_decode()将JSON字符串转换为关联数组。 - 提取事件集合:原JSON外层是带数字键的对象,用
array_values()提取内部事件数据,得到纯索引数组。 - 自定义排序:通过
usort()搭配比较函数,将start字段的日期字符串转换为可比较的时间戳或DateTime对象。 - (可选)转回JSON:若需要输出排序后的JSON,用
json_encode()转换即可。
// 你的JSON字符串 $jsonStr = '{ "0": { "id": 1, "rid": 1, "eventType": "Rendez-vous simple", "title": "CONGES PAYES", "description": "", "start": "01-01-2024 00:00:00", "end": "06-01-2024 00:00:00", "color": "#000" }, "1": { "id": 2, "rid": 2, "eventType": "Rendez-vous simple", "title": "CARGILL Za 44000 MONTOIR", "description": "[R\u00e9f:6201]", "start": "16-01-2024 08:00:00", "end": "16-01-2024 10:00:00", "color": "#CF00F4" }, "2": { "id": 3, "rid": 3, "eventType": "Rendez-vous simple", "title": "ADMINISTRATIF", "description": "", "start": "08-01-2024 00:00:00", "end": "13-01-2024 00:00:00", "color": "#FF8C00" } }'; // 解析为关联数组 $data = json_decode($jsonStr, true); // 提取事件数组(去除外层数字键) $events = array_values($data); // 按start日期升序排序(PHP7+可用太空船运算符,更简洁) usort($events, function($a, $b) { $dateA = DateTime::createFromFormat('d-m-Y H:i:s', $a['start']); $dateB = DateTime::createFromFormat('d-m-Y H:i:s', $b['start']); return $dateA <=> $dateB; }); // 输出排序后的数组 echo "<pre>"; print_r($events); echo "</pre>"; // 或者转成格式化后的JSON输出 // echo json_encode($events, JSON_PRETTY_PRINT);
补充说明
用DateTime::createFromFormat()处理日期比strtotime()更可靠,尤其是当日期格式固定时,能避免格式识别错误的问题。如果需要降序排序,只需将$dateA <=> $dateB改为$dateB <=> $dateA即可。
内容的提问来源于stack exchange,提问作者Alain
相关产品推荐
相关产品推荐

