我有一个像这样的值的数组
04|2012
05|2011
05|2011
06|2011
08|2011
实际上这些是日期。问题是我无法弄清楚如何命令它们下降
答案 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维数组,但是按降序排列。