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

フラグksort付きで使用できます。natural(PHP 5.4以降のみがサポート)

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

2桁の週でフォーマットすると、希望する結果が得られます。2011-03のようなもの。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 に答える