如何对日期数组进行排序?

问题描述 投票:0回答:6

我有一个未排序的日期数组:

[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
,但没有成功。我该如何排序?

php arrays sorting date
6个回答
68
投票

如果日期是“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']
,则上述函数将返回错误的结果。因此,最好明确定义日期格式,如这个答案

中所述

5
投票

提供的示例日期数据不清楚它们是什么格式。可以肯定的是,您应该使用

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");

0
投票

最好的方法是将日期采用 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";
}

-1
投票

试试这个,

<?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 );
?>

将按照您想要的顺序对日期进行排序。


-1
投票

尝试以下代码:

<?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>";
}
?>

-2
投票

我通过应用这条线解决了这个问题。

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
© www.soinside.com 2019 - 2024. All rights reserved.