
本文详解如何使用 uasort() 对关联索引的多维数组进行多字段(先按日期、再按小时)稳定排序,并提供可直接运行的代码示例与关键注意事项。
在 PHP 中对多维数组进行多条件排序,尤其是需保持原始键名(如 '621223d55f426')不丢失且按多个字段(Date + Hour)优先级排序时,usort() 会重置键名,而 uasort() 是更优选择——它在自定义比较逻辑的同时保留数组的关联键。
核心原理是利用 PHP 的飞船操作符()实现三路比较,并通过空合并逻辑(?:)构建优先级链:当第一排序字段相等时,自动降级到第二字段比较。
以下为完整、可运行的解决方案:
['Timestamp' => '2022-02-20 04:00', 'Date' => '2022-02-20', 'Hour' => '04'],
'621223d55f438' => ['Timestamp' => '2022-02-20 00:00', 'Date' => '2022-02-20', 'Hour' => '00'],
'621223d55f43f' => ['Timestamp' => '2022-02-20 01:00', 'Date' => '2022-02-20', 'Hour' => '01'],
'621223d55f444' => ['Timestamp' => '2022-02-20 03:00', 'Date' => '2022-02-20', 'Hour' => '03'],
'621223d55f449' => ['Timestamp' => '2022-02-20 02:00', 'Date' => '2022-02-20', 'Hour' => '02'],
];
uasort($data, function($a, $b) {
// 先按 Date 升序;相等时再按 Hour 升序
return $a['Date'] <=> $b['Date']
?: $a['Hour'] <=> $b['Hour'];
});
print_r($data);
?>✅ 输出结果严格符合预期:键名保留,数据按 'Date' 升序排列,同日期下按 'Hour' 字典升序('00', '01', ..., '04')。
立即学习“PHP免费学习笔记(深入)”;
⚠️ 关键注意事项:
- uasort() 是原地排序,直接修改原数组,如需保留原始顺序,请先用 $sorted = $data; 复制;
- 'Hour' 字段若为 '00'/'01' 等零填充字符串,字典序与数值序一致;若为整数(如 0, 1),仍可安全使用 ;
- 若需降序,交换 $a 和 $b 位置即可(如 $b['Date'] $a['Date']);
- Timestamp 字段含 (HTML 空格实体),但本例未参与排序,如需基于时间戳精确排序,建议先 str_replace(' ', ' ', $a['Timestamp']) 并用 strtotime() 转换为时间戳再比较。
? 进阶提示:若排序字段存在缺失或类型不一致(如某些 'Hour' 为空),应在比较前做防御性检查(如 ?? '00'),避免 null 导致意外排序行为。
综上,uasort() + 飞船操作符 + 空合并 ?: 构成了 PHP 多维数组多条件排序简洁、高效、可读性强的标准范式。











