为什么这个用户不订购一系列日期?

时间:2015-10-02 10:28:24

标签: php arrays sorting date usort

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

$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');

返回:

  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转换日期。

2 个答案:

答案 0 :(得分:3)

您可以像{/ p>一样使用usort

usort($ta,function($a,$b){
    return strtotime(str_replace('/', '-', $a)) - strtotime(str_replace('/', '-', $b));
});

简要说明:

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

Demo

答案 1 :(得分:0)

将它们排序为字符串将无法正常工作,因为它将按字母顺序排序。 1988年1月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()转换回您想要的任何格式。