PHP如何实现今日前日期升序、今日后日期降序的数组排序
实现方法
由于使用的日期是标准YYYY-MM-DD格式,字符串的字典比较结果和日期先后顺序完全一致,无需额外转时间戳处理,按拆分-排序-合并的逻辑实现即可:
- 将原数组拆分为两组:早于今日的过去日期、晚于/等于今日的未来日期
- 过去日期组按升序(ASC)排列,未来日期组按降序(DESC)排列
- 将排序后的过去日期组放在前、未来日期组放在后,合并得到最终结果
代码实现(逻辑拆分版,可读性更高)
<?php $array = [ '2022-06-30', '2022-04-20', '2021-04-07', '2022-09-09', '2022-03-08', '2021-08-07', '2022-10-12' ]; $today = '2022-06-02'; // 设定的今日基准日期 $past = []; $future = []; // 拆分两组日期 foreach ($array as $date) { $date < $today ? $past[] = $date : $future[] = $date; } sort($past); // 过去日期升序排列 rsort($future); // 未来日期降序排列 $result = array_merge($past, $future);
运行后$result的输出和预期结果完全一致:
array ( 0 => '2021-04-07', 1 => '2021-08-07', 2 => '2022-03-08', 3 => '2022-04-20', 4 => '2022-10-12', 5 => '2022-09-09', 6 => '2022-06-30', )
单排序函数实现版本
如果不想拆分数组,也可以直接用usort自定义比较规则实现,结果完全相同:
<?php $array = [ '2022-06-30', '2022-04-20', '2021-04-07', '2022-09-09', '2022-03-08', '2021-08-07', '2022-10-12' ]; $today = '2022-06-02'; usort($array, function($a, $b) use ($today) { $aPast = $a < $today; $bPast = $b < $today; // 跨组时所有过去日期排在未来日期之前 if ($aPast != $bPast) { return $aPast ? -1 : 1; } // 同组内:过去日期升序,未来日期降序 return $aPast ? $a <=> $b : $b <=> $a; });
两种写法都可以,优先选逻辑拆分版,后续调整排序规则时更易维护。
内容的提问来源于stack exchange,提问作者Erik_Ond
相关产品推荐
相关产品推荐

