You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:58:07