PHP多维数组先按日期键再按时间键排序方案求助
实现按日期+时间的多维数组排序
嘿,这个需求确实很常见,你已经迈出了关键的第一步,只需要在日期相等的分支里补充对StartTime的排序逻辑就可以完成啦!下面给你几种可行的实现方式:
方式一:扩展你现有的比较函数
直接在你写的cmp函数里,当两个元素的ClassDate相等时,加入对StartTime的比较逻辑:
function cmp($a, $b) { // 先比较ClassDate字段 $aDate = strtotime($a['ClassDate']); $bDate = strtotime($b['ClassDate']); if ($aDate != $bDate) { return ($aDate < $bDate) ? -1 : 1; } // 日期相同时,再比较StartTime字段 $aTime = strtotime($a['StartTime']); $bTime = strtotime($b['StartTime']); if ($aTime == $bTime) { return 0; } return ($aTime < $bTime) ? -1 : 1; } usort($result_array, "cmp");
方式二:PHP7+ 简洁写法(太空船运算符)
如果你使用的是PHP7及以上版本,用太空船运算符(<=>)可以大幅简化比较逻辑,搭配匿名函数可读性更强:
usort($result_array, function($a, $b) { // 先按ClassDate排序,日期相同则按StartTime排序 $dateCompare = strtotime($a['ClassDate']) <=> strtotime($b['ClassDate']); return $dateCompare === 0 ? strtotime($a['StartTime']) <=> strtotime($b['StartTime']) : $dateCompare; });
进阶:PHP7.4+ 箭头函数写法
如果你的PHP版本在7.4及以上,还可以用箭头函数让代码更紧凑:
usort($result_array, fn($a, $b) => strtotime($a['ClassDate']) <=> strtotime($b['ClassDate']) ?: strtotime($a['StartTime']) <=> strtotime($b['StartTime']) );
小补充
因为StartTime是标准的HH:MM:SS格式,直接做字符串比较也能得到正确结果(比如"06:00:00"会小于"07:45:00"),所以也可以把strtotime($a['StartTime'])换成$a['StartTime'],这样性能会略好一点,但用strtotime的兼容性更强,万一后续时间格式有调整也能正常处理。
内容的提问来源于stack exchange,提问作者Shujaat Shaikh
相关产品推荐
相关产品推荐

