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
相关产品推荐
相关产品推荐

