PHP 多维数组按日期和小时双重排序的完整教程

8次阅读

PHP 多维数组按日期和小时双重排序的完整教程

本文详解如何使用 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 多维数组多条件排序简洁、高效、可读性强的标准范式。

text=ZqhQzanResources