如何在 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生成别名【方法】

