从当前日期升序订购对象

时间:2019-10-08 20:15:52

标签: php arrays sorting

在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
        )
)

2 个答案:

答案 0 :(得分:2)

在比较功能中,您将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;
}

DEMO

另一种选择(也许在性能上可能更好)是迭代数组,与当天比较,根据需要调整日期,然后在调整后的数组上调用usort()

答案 1 :(得分:0)

排序功能可以是这样的:

$now = new DateTime();

usort($users, function($a, $b) use ($now) {
    $aDate = new DateTime($a->bday);
    if ($aDate < $now) {
        $aDate->add(new DateInterval('P1Y'));
    }

    $bDate = new DateTime($b->bday);
    if ($bDate < $now) { 
        $bDate->add(new DateInterval('P1Y'));
    }

    return $aDate > $bDate;  
});

当然,转换为DateTime对象可以在单独的while循环中执行一次,以减少冗余。

提琴https://3v4l.org/u3U80