我有一个未排序的日期数组:
[0] => 11-01-2012
[1] => 01-01-2014
[2] => 01-01-2015
[3] => 09-02-2013
[4] => 01-01-2013
我想这样排序:
[0] => 11-01-2012
[1] => 01-01-2013
[2] => 09-02-2013
[3] => 01-01-2014
[4] => 01-01-2015
asort
,但没有成功。我该如何排序?
如果日期是“Mysql”格式(
Y-m-d
或Y-m-d H:i:s
),那么您可以立即对数组进行排序,无需特殊操作:
$arr = ["2019-11-11", "2019-10-10","2019-11-11", "2019-09-08","2019-05-11"];
sort($arr);
如果日期已本地化或格式化(您应该避免,仅在输出之前格式化日期),您必须使用自定义排序函数,例如
usort()
,它将在比较之前将日期转换为可排序格式。
strtotime()
函数将其转换为 uninx 时间戳:
$arr = ['11/01/2012', '03/16/2022', '12/26/2021', '01/01/2014', '09/02/2013'];
usort($arr, function ($a, $b) {
return strtotime($a) - strtotime($b);
});
print_r($arr);
但是,可能存在陷阱,因为在不同的国家/地区,相同的日期格式可能意味着不同的日期。您的示例格式正是这种情况,如果日期为
['03-16-2022', '12-26-2021', '06-06-2022']
,则上述函数将返回错误的结果。因此,最好明确定义日期格式,如这个答案中所述
提供的示例日期数据不清楚它们是什么格式。可以肯定的是,您应该使用
DateTime::createFromFormat
,然后明确指定格式:
$dates = ['11-01-2012', '03-16-2022', '12-26-2021', '01-01-2014', '01-01-2015', '09-02-2013', '01-01-2013'];
function sort_date($a, $b) {
return \DateTime::createFromFormat('m-d-Y', $a) <=> \DateTime::createFromFormat('m-d-Y', $b);
}
usort($dates, "sort_date");
最好的方法是将日期采用 ISO 8601 格式,并且仅在输出时将其更改为您想要的格式。此格式的日期可以使用字母数字排序进行排序。您只需使用
sort()
函数即可将日期作为字符串进行比较。
当您的数据不是标准格式时,最好的选择是将所有字符串转换为
DateTime
对象,对它们进行排序,然后在输出过程中将它们格式化回您想要的模式。
$dateTimeObjects = array_map(fn ($date) => DateTimeImmutable::createFromFormat('d-m-Y', $date), $dates);
sort($dateTimeObjects);
foreach ($dateTimeObjects as $dateTimeObject) {
echo $dateTimeObject->format('d-m-Y') . "\n";
}
试试这个,
<?php
$array = [ '11-01-2012', '01-01-2014', '01-01-2015', '09-02-2013', '01-01-2013' ];
function sortFunction( $a, $b ) {
return strtotime($a) - strtotime($b);
}
usort($array, "sortFunction");
var_dump( $array );
?>
将按照您想要的顺序对日期进行排序。
尝试以下代码:
<?php
$array = array('11-01-2012','01-01-2011','09-02-2013','01-01-2014','01-01-2015');
function cmp($a, $b)
{
$a = date('Y-m-d', strtotime($a));
$b = date('Y-m-d', strtotime($b));
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}
usort($array, "cmp");
foreach ($array as $key => $value) {
echo "[$key]=> $value <br>";
}
?>
我通过应用这条线解决了这个问题。
sort($imdarrayGG['newDate']);
添加值之前的输出
[Mon Jul 6 10:33:23 2020] Array
(
[coursedate] => 2020-07-17
[newDate] => Array
(
[0] => 2020-07-30
[1] => 2020-07-07
[2] => 2020-07-08
[3] => 2020-07-17
)
)
我放线后,输出会变成这样。
[Mon Jul 6 10:35:42 2020] Array
(
[coursedate] => 2020-07-17
[newDate] => Array
(
[0] => 2020-07-07
[1] => 2020-07-08
[2] => 2020-07-17
[3] => 2020-07-30
)
)
已排序的日期,最新日期将在最上面。
这是我们有对象的地方,然后我们想要对所有对象进行排序
示例:-
[status_custom] => Array
(
[0] => stdClass Object
(
[type] => LDL - B2
[date] => 23/10/2014
)
[1] => stdClass Object
(
[type] => LDL - D
[date] => 18/04/2015
)
)
首先我们必须进行转换。 参考此链接进行转换 然后我们对它们进行排序。 参考此链接对对象进行排序
我们开始:-
//At here we want to sort according to latest date. But this one involve with the object also.
usort($array_custom_object, function ($a, $b) {
$date1 = $a->date;
$date2 = $b->date;
//Since the income date is formatted like this d/m/Y , we have to change it
$date1 = date_format(date_create_from_format('d/m/Y', $date1), 'Y-m-d');
$date2 = date_format(date_create_from_format('d/m/Y', $date2), 'Y-m-d');
if ($date1 > $date2) {
return -1;
}
if ($date1 == $date2) {
return 0;
}
if ($date1 < $date2) {
return 1;
}
});
$dataFinal->status_custom = $array_custom_object; //Result