包含日期的订单数组

时间:2011-05-13 07:13:51

标签: php

我有一个像这样的值的数组

04|2012
05|2011
05|2011
06|2011
08|2011

实际上这些是日期。问题是我无法弄清楚如何命令它们下降

4 个答案:

答案 0 :(得分:3)

假设该格式代表month|year并且您正在运行PHP 5.3 +:

usort($array, function ($a, $b) {
    $toTime = function ($str) {
        list($month, $year) = explode('|', $str);
        return mktime(0, 0, 0, $month, 1, $year);
    }

    $a = $toTime($a);
    $b = $toTime($b);

    if ($a == $b) {
        return 0;
    }
    return $a < $b ? -1 : 1;
});

答案 1 :(得分:3)

如果您使用类似SQL的日期格式(yyyy-mm-dd),那么您可以按任何顺序将日期直接排序为字符串。

如果日期格式无法更改:

<?php

$a = array(
    '04|2012',
    '05|2011',
    '05|2011',
    '06|2011',
    '08|2011',
);


function compare_strange_dates($date1, $date2) {
    return strcmp(
        implode('-', array_reverse(explode('|', $date1))),
        implode('-', array_reverse(explode('|', $date2)))
    );
}

usort($a, 'compare_strange_dates'); // ascending
$d = array_reverse($a); // descending

var_dump($a);
var_dump($d);

如果只想降序,请在compare_strange_dates()返回语句中交换$ date1和$ date2,并仅使用usort。

答案 2 :(得分:1)

$dates作为您的数组,您可以执行(demo

usort($dates, function($a, $b) {
    return DateTime::createFromFormat('m\|Y', $b)->format('U')
         - DateTime::createFromFormat('m\|Y', $a)->format('U');
});
print_r($dates);

不需要转换为日期而且应该更快的替代方案(demo

usort($dates, function($a, $b) {
    return preg_replace('#(\d{2})\|(\d{4})#', '$2$1', $b)
         - preg_replace('#(\d{2})\|(\d{4})#', '$2$1', $a);
});
print_r($dates);

两个输出

Array
(
    [0] => 04|2012
    [1] => 08|2011
    [2] => 06|2011
    [3] => 05|2011
    [4] => 05|2011
)

注意:由于lambdas,所有这些都需要PHP 5.3+。

答案 3 :(得分:0)

如果您需要仅使用数组中的这两个项进行排序,则可以在一维整数数组中的单个项中连接年份和日期,并具有以下内容:

201204
201105
201105
201106
201108

并且在此类之后它就像一个ussual one维数组,但是按降序排列。