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

PHP如何实现今日前日期升序、今日后日期降序的数组排序

实现方法

由于使用的日期是标准YYYY-MM-DD格式,字符串的字典比较结果和日期先后顺序完全一致,无需额外转时间戳处理,按拆分-排序-合并的逻辑实现即可:

  1. 将原数组拆分为两组:早于今日的过去日期、晚于/等于今日的未来日期
  2. 过去日期组按升序(ASC)排列,未来日期组按降序(DESC)排列
  3. 将排序后的过去日期组放在前、未来日期组放在后,合并得到最终结果

代码实现(逻辑拆分版,可读性更高)

<?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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 03:33:31