Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 按从当前日期起的升序日期排列对象集合_Php_Arrays_Sorting - Fatal编程技术网

Php 按从当前日期起的升序日期排列对象集合

Php 按从当前日期起的升序日期排列对象集合,php,arrays,sorting,Php,Arrays,Sorting,在PHP中,我有一个对象数组,我需要从今天起的最新日期开始对它进行排序。日期存储为字符串,仅包含月份和日期 我可以使用usort和下面的函数按时间顺序对它进行排序,但与今天的日期相比,我很难让它排序 函数日期\u排序($a,$b){ 返回strotime($a->bday)-strotime($b->bday); } usort($users,“date_sort”); 原始阵列如下所示: $now = new DateTime(); usort($users, function($a, $

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

我可以使用usort和下面的函数按时间顺序对它进行排序,但与今天的日期相比,我很难让它排序

函数日期\u排序($a,$b){
返回strotime($a->bday)-strotime($b->bday);
}
usort($users,“date_sort”);
原始阵列如下所示:

$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;  
});
$users=array(
[0]=>stdClass对象
(
[姓名]=>蒂姆
[B日]=>9月13日
)
[1] =>stdClass对象
(
[姓名]=>斯科特
[B日]=>11月8日
)
[2] =>stdClass对象
(
[姓名]=>鲍勃
[B日]=>10月13日
)
[3] =>stdClass对象
(
[姓名]=>丹
[b日期]=>2月2日
)
[4] =>stdClass对象
(
[姓名]=>杰克
[B日]=>7月11日
) 
)
如果今天是10月8日,我需要排序的数组如下所示:

$users=array(
[0]=>stdClass对象
(
[姓名]=>鲍勃
[B日]=>10月13日
)
[1] =>stdClass对象
(
[姓名]=>斯科特
[B日]=>11月8日
)
[2] =>stdClass对象
(
[姓名]=>丹
[b日期]=>2月2日
)
[3] =>stdClass对象
(
[姓名]=>杰克
[B日]=>7月11日
) 
[4] =>stdClass对象
(
[姓名]=>蒂姆
[B日]=>9月13日
)
)

在比较函数中,将
strotime()
中的时间戳与当前日期的时间戳进行比较。由于默认情况下,它将在没有年份的天数内使用当前年份,因此如果时间戳小于当前时间戳,请添加一年。对
$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;
}
函数日期\u排序($a,$b){
如果(标准时间($a->B日)<标准时间(日期(“Y-m-d”))
{
$adate=标准时间(日期(“Y-m-d”,标准时间($a->B日))。“+1年”);
}
其他的
{
$adate=strottime($a->b天);
}
如果(标准时间($b->b日)<标准时间(日期(“Y-m-d”))
{
$bdate=strottime(日期(“Y-m-d”,strottime($b->bday))。“+1年”);
}
其他的
{
$b日期=标准时间($b->b日期);
}
返回$adate-$bdate;
}


另一个选项(从性能角度看可能更好)是迭代数组,与当前日期进行比较,根据需要调整日期,然后在调整后的数组上调用
usort()

排序函数可以是这样的:

$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;  
});
$now=new DateTime();
usort($users,function($a,$b)use($now){
$aDate=新日期时间($a->B天);
如果($aDate<$now){
$aDate->add(新日期间隔('P1Y');
}
$b日期=新日期时间($b->b日期);
如果($bDate<$now){
$bDate->add(新日期间隔('P1Y');
}
返回$aDate>$bDate;
});
当然,转换为
DateTime
对象可以在单独的
while
循环中执行一次,以减少冗余

小提琴样本。

计算“现在-a”和“现在-b”的差异(反之亦然),并比较它们。。。