我有一个PHP数组,其中的键包含年份和周数,如下所示:
year-week
使用内置的ksort函数,它会像这样返回它们:
ksort($array);
2011-21
2011-3
2011-44
2011-45
是否可以按如下方式对它们进行数字排序:
2011-3
2011-21
2011-44
2011-45
答案 0 :(得分:10)
如果您使用的是PHP> = 5.4,请使用ksort($array, SORT_NATURAL);
答案 1 :(得分:8)
使用uksort
对密钥进行排序,并在回调使用中strnatcmp
。
uksort($array, function($a,$b){
return strnatcmp($a,$b);
});
答案 2 :(得分:2)
您可以使用natsort
$a = array_keys($myarray);
// $a now has
// array('2011-21', '2011-3', '2011-45', '2011-44');
natsort($a);
打印
2011-3
2011-21
2011-44
2011-45
然后,您可以使用$a
数组作为对包含数据的数组的每个元素的引用(在上面的示例中为$myarray
)
答案 3 :(得分:1)
您可以将ksort
与natural
标志一起使用。 (只有PHP 5.4+支持)
ksort($array, SORT_NATURAL);
答案 4 :(得分:1)
如果您使用2位数周格式化它们,您将获得所需的结果。更像2011-03的东西。请参阅sprint_f()。
答案 5 :(得分:0)
我看到更简单的解决方案可用,但这是我最初的想法:
function cmp($a, $b) {
$comp1 = explode('-', $a);
$comp2 = explode('-', $b);
$year1 = (int) $comp1[0];
$year2 = (int) $comp2[0];
$week1 = (int) $comp1[1];
$week2 = (int) $comp2[1];
if ($year1 == $year2 && $week1 == $week2) {
return 0;
} elseif ($year1 == $year2) {
return ($week1 < $week2) ? -1 : 1;
} else {
return ($year1 < $year2) ? -1 : 1;
}
}
$array = array('2011-21', '2011-3', '2011-44', '2011-45');
uasort($array, 'cmp');