我在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
给出的结果几乎相同,因为将来的日期会给出负数并按升序排列负数将出现在正数之前。意思是,最近的日期将是第一个,而不是最新的日期。
我们非常感谢您的帮助。
答案 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日。
如果有人知道更优雅的方法,那就让世界知道。