在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
)
)
答案 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;
}
另一种选择(也许在性能上可能更好)是迭代数组,与当天比较,根据需要调整日期,然后在调整后的数组上调用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
循环中执行一次,以减少冗余。