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

PHP多维数组排序:先按开始日期,相同则按结束日期

按开始日期+结束日期对多维数组排序的解决方案

首先修正你原代码里的一个笔误:你的示例数组中日期字段是start,但代码里写的是datetime,需要改成start才能正常运行。

要实现先按开始日期升序排序,当开始日期相同时,再按结束日期升序排序的需求,只需要在排序回调里先比较start字段,若结果为0(即两个元素的开始日期相同),再比较end字段即可。

完整实现代码

$array = [
    0 => [
        "id" => 1,
        "start" => "2024-07-24 05:00",
        "end" => "2024-07-25 14:00"
    ],
    1 => [
        "id" => 2,
        "start" => "2024-07-22 06:00",
        "end" => "2024-07-22 08:00"
    ],
    2 => [
        "id" => 3,
        "start" => "2024-07-27 10:00",
        "end" => "2024-07-28 11:00"
    ],
    3 => [
        "id" => 4,
        "start" => "2024-07-22 06:00",
        "end" => "2024-07-22 07:00"
    ]
];

// 排序函数
usort($array, function($a, $b) {
    // 先比较开始日期
    $startDiff = new DateTime($a['start']) <=> new DateTime($b['start']);
    // 开始日期相同则比较结束日期
    if ($startDiff === 0) {
        return new DateTime($a['end']) <=> new DateTime($b['end']);
    }
    return $startDiff;
});

// 验证结果(输出id顺序)
foreach ($array as $item) {
    echo $item['id'] . " ";
}
// 输出:4 2 1 3

更简洁的写法

利用PHP的?:短路运算符,当第一个比较返回0时,自动执行第二个比较:

usort($array, function($a, $b) {
    return new DateTime($a['start']) <=> new DateTime($b['start'])
        ?: new DateTime($a['end']) <=> new DateTime($b['end']);
});

逻辑说明

  • 太空船运算符<=>会返回三个值:-1(左值小于右值)、0(左右值相等)、1(左值大于右值)
  • 先判断start字段的比较结果,若结果不为0,直接返回该结果完成排序;若结果为0,再比较end字段并返回其结果,实现多级排序

内容的提问来源于stack exchange,提问作者itajackass

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 17:37:41