PHP数组中的键未按数字排序

时间:2012-10-11 18:16:47

标签: php

我有一个PHP数组,其中的键包含年份和周数,如下所示:

year-week

使用内置的ksort函数,它会像这样返回它们:

ksort($array);

2011-21
2011-3
2011-44
2011-45

是否可以按如下方式对它们进行数字排序:

2011-3
2011-21
2011-44
2011-45

6 个答案:

答案 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)

您可以将ksortnatural标志一起使用。 (只有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');