php - 从当前日期按升序排列对象集合
问题描述
在 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
)
)
解决方案
在比较函数中,您将时间戳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()
调整后的数组。
推荐阅读
- perl - Excel::Writer::XLSX 用粗边框分隔列
- python - 如何通过删除引号并在每个值之间添加逗号来更改 numpy 数组?
- java - Eclipse 模块问题 jdk 10
- node.js - 无效的频道名称 - 可能是什么原因造成的?
- python - 什么是神经网络在张量流中执行
- node.js - 通过咖啡脚本中的承诺和循环避免内存泄漏(无等待)
- java - 无需再次读取文件即可获取全局变量的值
- javascript - 为什么 array.splice() 在用于作为其副本的变量时会更改变量?
- c# - Monogame:在类中创建绘图函数
- r - 如果另一个感兴趣的变量不止一次出现,则如果存在 NA 则子集行?