为什么这个 usort 不排序日期数组?

Why is this usort not ordering an array of dates?

我试图按时间顺序排列这个数组:

$ta = array (
    0 => '20/05/2012',
    1 => '08/01/2011',
    2 => '23/10/2010',
    3 => '27/07/2013',
    4 => '28/01/2011',
    5 => '21/10/2010',
    5 => '18/07/2013',
);


function comp2($a, $b) {
    if ($a == $b)
        return 0;

    return ($a < $b) ? 1 : -1;
};

usort($ta,'comp2');

这个returns:

  Array
(
  [0] => 28/01/2011
  [1] => 27/07/2013
  [2] => 23/10/2010
  [3] => 20/05/2012
  [4] => 18/07/2013
  [5] => 08/01/2011
)

我也用strtotime转换了日期,后来改成mm/dd/yyyy也无济于事。

仅将它们按字符串排序是行不通的,因为它会按字母顺序对它们进行排序。 1988 年 1 月的第一天将在 2015 年 12 月的最后一天之前出现,因为它以第一个字符 - 天开始。

因此您必须将字符串转换为日期。这里的问题是 strtotime() 不接受 dd/mm/YYYY 格式。使用 this 解决方法,您将获得以下代码:

function comp2($a, $b) {
    $x = toDate($a);
    $y = toDate($b);
    if ($x == $y) return 0;
    return ($x < $y) ? 1 : -1;
}

function toDate($d) {
    return strtotime(str_replace('/', '-', $d));
}

如果您有很多日期要排序,那么这不是很有效。同一日期将与多个日期进行比较,因此会多次转换。那是一种资源浪费。因此,如果性能是一个问题,请循环遍历数组并转换所有日期,然后仅使用 sort() 对其进行排序。之后,您可以使用 date().

转换回您想要的任何格式

你可以像

一样简单地使用usort
usort($ta,function($a,$b){
    return strtotime(str_replace('/', '-', $a)) - strtotime(str_replace('/', '-', $b));
});

简要说明:

此处您拥有的日期结构是美国日期格式,即 m/d/Y。因此需要首先将其替换为欧洲日期格式,即 d-m-y 。您可以查看 答案 PHP 将日期转换为 strtotime。

Demo