按最接近的日期对对象数组进行排序

时间:2020-03-02 16:51:15

标签: php arrays date usort

我在PHP中有一个带有一个键的对象数组-日期。我有未来的日期以及过去的日期。我需要按最新日期对它们进行排序。

这是我来自var_dump()的数组

array (size=15)
  0 => 
    object(stdClass)[7852]
      public 'date' => string '20200417' (length=8)
  1 => 
    object(stdClass)[7846]
      public 'date' => string '20200302' (length=8)
  2 => 
    object(stdClass)[7856]
      public 'date' => string '20200224' (length=8)
  3 => 
    object(stdClass)[7853]
      public 'date' => string '20200220' (length=8)
  4 => 
    object(stdClass)[7847]
      public 'date' => string '20200213' (length=8)
  5 => 
    object(stdClass)[7845]
      public 'date' => string '20200211' (length=8)
  ...

有没有一种方法可以对此进行排序,以便第一个对象是20200302,然后是20200224,依此类推。但是将来的日期将在数组的最后。

我已经尝试过了:

usort($arr, function($a, $b) {
    return strtotime($b->date) - strtotime($a->date);
});

但是此代码并不关心当前日期,只是将它们排序为日期。 我还尝试了一种变通方法,它从date('Ymd') - $arr->date计算间隔并将其设置为对象的一部分,但是strcmp()函数中的usrot给出的结果几乎相同,因为将来的日期会给出负数并按升序排列负数将出现在正数之前。意思是,最近的日期将是第一个,而不是最新的日期。

我们非常感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您需要做的是弄清楚每个日期离今天有多远,并用它来对项目进行排序,也许有一种更优雅的方式,但是(我认为)可以。基本上使用abs()来确保所有差异都为+ ve,并且使每个日期都远离今天...

usort($arr, function($a, $b) {
    return (abs(strtotime('today') - strtotime($a->date))
        - (abs(strtotime('today') - strtotime($b->date))));
});

答案 1 :(得分:0)

奈杰尔的答案很有帮助,但结果却不尽相同,有时日期会遍地开花,我不知道为什么。因此,我想出了一种解决方法,也许这会对互联网上的某人有所帮助。

我向对象添加了另一个键/值-interval,该键的值是按以下方式计算的。

$interval_raw = date("Ymd") - get_field('date_nachalo') + 1;
    if($interval_raw < 0) {
        $interval_raw += 10000;
    }

因此,如果我得到的负数是任何将来的日期,我将提前10000加上10000,这大约是30年,我想这有点过头了,因为没有正常的人将事件安排在很远的将来。另外,添加+ 1,以便下一个即将到来的日期为第一。如果我删除它,那么第一个日期将是过去的日期。基本上,如果今天是3月10日,最后一个事件是3月1日,而下一个事件是3月11日,那么如果没有+ 1,则第一个事件日期将是3月1日,而不是3月11日。

如果有人知道更优雅的方法,那就让世界知道。