如何在 PHP 中按多个键(日期和小时)对多维数组进行稳定排序

发布时间 - 2026-01-28 00:00:00    点击率:

本文介绍使用 `uasort()` 配合飞船

操作符(``)实现多维关联数组的多级排序,优先按日期升序、再按小时升序,同时保留原始键名。

在 PHP 中对多维数组进行多条件排序时,sort() 或 ksort() 等基础函数无法满足“先按 Date、再按 Hour”的复合排序需求。正确方案是使用 uasort() —— 它允许自定义比较逻辑,且保持数组的关联键(key)不被重置,这对处理带唯一 ID 键(如 '621223d55f438')的数据至关重要。

核心技巧在于利用 PHP 的空合并式比较链(?:):当第一级比较结果为 0(即相等)时,才执行第二级比较。这确保了排序的稳定性与层级优先级。

以下为完整可运行示例:

 ['Timestamp' => '2025-02-20 04:00', 'Date' => '2025-02-20', 'Hour' => '04'],
  '621223d55f438' => ['Timestamp' => '2025-02-20 00:00', 'Date' => '2025-02-20', 'Hour' => '00'],
  '621223d55f43f' => ['Timestamp' => '2025-02-20 01:00', 'Date' => '2025-02-20', 'Hour' => '01'],
  '621223d55f444' => ['Timestamp' => '2025-02-20 03:00', 'Date' => '2025-02-20', 'Hour' => '03'],
  '621223d55f449' => ['Timestamp' => '2025-02-20 02:00', 'Date' => '2025-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')位置正确保留。

⚠️ 注意事项

  • 使用 uasort() 而非 usort():后者会重置键名为数字索引(0,1,2...),丢失原始标识;
  • Date 和 Hour 字段需为规范字符串(如 '2025-02-20' 和 '00'),确保字典序即逻辑序;若 Hour 为整数(如 0),建议统一转为两位字符串或直接参与数值比较(intval($a['Hour']));
  • 若需降序,交换 $a 和 $b 位置即可(如 $b['Date'] $a['Date']);
  • 对于更复杂场景(如混合升/降序、时间戳解析),可扩展回调函数,例如用 strtotime($a['Timestamp']) 替代拼接字段。

该方法简洁、高效、符合 PHP 7+ 最佳实践,是处理多维关联数组多级排序的标准解法。


# php  # 回调函数  # 关联数组  # 多维数组  # sort  # ksort  # date  # timestamp  # 字符串  # 升序  # 多维  # 再按  # 降序  # 键名  # 两位  # 这对  # 自定义  # 不被  # 而非 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  如何彻底卸载建站之星软件?  如何在万网利用已有域名快速建站?  新三国志曹操传主线渭水交兵攻略  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  html5audio标签播放结束怎么触发事件_onended回调方法【教程】  浅析上传头像示例及其注意事项  音响网站制作视频教程,隆霸音响官方网站?  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  高端网站建设与定制开发一站式解决方案 中企动力  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  Laravel如何实现数据库事务?(DB Facade示例)  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  昵图网官网入口 昵图网素材平台官方入口  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  如何在 React 中条件性地遍历数组并渲染元素  Laravel如何配置和使用缓存?(Redis代码示例)  Laravel如何使用withoutEvents方法临时禁用模型事件  Android滚轮选择时间控件使用详解  宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  如何挑选高效建站主机与优质域名?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  香港网站服务器数量如何影响SEO优化效果?  如何在万网主机上快速搭建网站?  nodejs redis 发布订阅机制封装实现方法及实例代码  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  如何快速查询域名建站关键信息?  Laravel如何处理和验证JSON类型的数据库字段  微信小程序 input输入框控件详解及实例(多种示例)  如何用低价快速搭建高质量网站?  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  IOS倒计时设置UIButton标题title的抖动问题  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  如何安全更换建站之星模板并保留数据?  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  如何在IIS7中新建站点?详细步骤解析  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  如何在Ubuntu系统下快速搭建WordPress个人网站?  jQuery中的100个技巧汇总  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  Laravel中的Facade(门面)到底是什么原理  如何批量查询域名的建站时间记录?  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】