
本文介绍使用 `uasort()` 配合飞船操作符(``)实现多维关联数组的多级排序,优先按日期升序、再按小时升序,同时保留原始键名。
在 PHP 中对多维数组进行多条件排序时,sort() 或 ksort() 等基础函数无法满足“先按 Date、再按 Hour”的复合排序需求。正确方案是使用 uasort() —— 它允许自定义比较逻辑,且保持数组的关联键(key)不被重置,这对处理带唯一 ID 键(如 '621223d55f438')的数据至关重要。
核心技巧在于利用 PHP 的空合并式比较链(?:):当第一级比较结果为 0(即相等)时,才执行第二级比较。这确保了排序的稳定性与层级优先级。
以下为完整可运行示例:
['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);
?>✅ 输出结果将严格匹配预期顺序:从 '00' 到 '04' 小时,所有日期相同(故仅触发二级排序),且原始键(如 '621223d55f438')位置正确保留。
立即学习“PHP免费学习笔记(深入)”;
⚠️ 注意事项:
- 使用 uasort() 而非 usort():后者会重置键名为数字索引(0,1,2...),丢失原始标识;
- Date 和 Hour 字段需为规范字符串(如 '2022-02-20' 和 '00'),确保字典序即逻辑序;若 Hour 为整数(如 0),建议统一转为两位字符串或直接参与数值比较(intval($a['Hour']));
- 若需降序,交换 $a 和 $b 位置即可(如 $b['Date'] $a['Date']);
- 对于更复杂场景(如混合升/降序、时间戳解析),可扩展回调函数,例如用 strtotime($a['Timestamp']) 替代拼接字段。
该方法简洁、高效、符合 PHP 7+ 最佳实践,是处理多维关联数组多级排序的标准解法。











