You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按时间顺序排序含多字段JSON文件的start日期?选sort()/usort()/asort()?

如何按start日期对JSON数据排序及函数选择

要实现按start日期排序,你需要选择usort()函数,另外两个函数并不适用,原因如下:

  • sort():仅适用于简单索引数组,会重置键名,且只能使用默认规则排序,无法处理需要自定义逻辑的日期排序场景。
  • asort():会保留原关联键,但同样只能按值的默认比较规则排序,无法处理日期字符串的转换比较。
  • usort():允许自定义排序逻辑,正好满足按start字段的日期顺序排序的需求。

实现步骤与代码示例

  1. 解析JSON为PHP数组:用json_decode()将JSON字符串转换为关联数组。
  2. 提取事件集合:原JSON外层是带数字键的对象,用array_values()提取内部事件数据,得到纯索引数组。
  3. 自定义排序:通过usort()搭配比较函数,将start字段的日期字符串转换为可比较的时间戳或DateTime对象。
  4. (可选)转回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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 02:50:19