首页 > 解决方案 > 从当前日期按升序排列对象集合

问题描述

在 PHP 中,我有一个对象数组,我需要从今天开始的最近日期开始对它进行排序并输出。日期存储为仅包含月份和日期的字符串。

我可以使用带有如下功能的 usort 来按时间顺序对其进行排序,但是与今天的日期相比,我正在努力解决如何对其进行排序。

function date_sort($a, $b) {
  return strtotime($a->bday) - strtotime($b->bday);
}

usort($users, "date_sort");

原始数组如下所示:

$users = array(
    [0] => stdClass Object
        (
            [name] => Tim
            [bday] => September 13
        )
    [1] => stdClass Object
        (
            [name] => Scott
            [bday] => November 8
        )
    [2] => stdClass Object
        (
            [name] => Bob
            [bday] => October 13
        )
    [3] => stdClass Object
        (
            [name] => Dan
            [bday] => February 2
        )
    [4] => stdClass Object
        (
            [name] => Jack
            [bday] => July 11
        ) 
)

如果今天是 10 月 8 日,我需要排序后的数组如下所示:

$users = array(
    [0] => stdClass Object
        (
            [name] => Bob
            [bday] => October 13
        )
    [1] => stdClass Object
        (
            [name] => Scott
            [bday] => November 8
        )
    [2] => stdClass Object
        (
            [name] => Dan
            [bday] => February 2
        )
    [3] => stdClass Object
        (
            [name] => Jack
            [bday] => July 11
        ) 
    [4] => stdClass Object
        (
            [name] => Tim
            [bday] => September 13
        )
)

标签: phparrayssorting

解决方案


在比较函数中,您将时间戳strtotime()与当前日期的时间戳进行比较。由于默认情况下它将使用当前年份的日子而没有年份,如果时间戳小于当前时间戳,则添加年份。对$a->bday$b->bday 都执行此操作。然后做你的比较。

function date_sort($a, $b) {
    if(strtotime($a->bday) < strtotime(date("Y-m-d")))
    {
        $adate = strtotime(date("Y-m-d", strtotime($a->bday)) . " +1 year");
    }
    else
    {
        $adate = strtotime($a->bday);
    }
    if(strtotime($b->bday) < strtotime(date("Y-m-d")))
    {
        $bdate = strtotime(date("Y-m-d", strtotime($b->bday)) . " +1 year");
    }
    else
    {
        $bdate = strtotime($b->bday);
    }
  return $adate - $bdate;
}

演示

另一种选择(可能在性能方面更好)是遍历数组,与当天进行比较,根据需要调整日期,然后调用usort()调整后的数组。


推荐阅读