5

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

year-week

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

ksort($array);

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

是否可以像这样对它们进行数字排序:

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

6 回答 6

12

如果您使用 PHP >= 5.4,请使用ksort($array, SORT_NATURAL);

于 2012-10-11T18:18:04.883 回答
8

用于uksort对键进行排序,并在回调中使用strnatcmp.

uksort($array, function($a,$b){
    return strnatcmp($a,$b);
});
于 2012-10-11T18:21:41.140 回答
3

您可以使用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

于 2012-10-11T18:23:09.017 回答
1

您可以ksortnatural标志一起使用。(仅 PHP 5.4+ 支持)

ksort($array, SORT_NATURAL);
于 2012-10-11T18:26:31.667 回答
1

如果你用 2 位数的周格式化它们,你会得到你想要的结果。更像是 2011 年 3 月。参见 sprint_f()。

于 2012-10-11T18:27:37.520 回答
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');
于 2012-10-11T18:29:17.940 回答