次のような年と週の番号を含むキーを持つPHP配列があります。
year-week
組み込みのksort関数を使用すると、次のように返されます。
ksort($array);
2011-21
2011-3
2011-44
2011-45
次のように数値で並べ替えることは可能ですか?
2011-3
2011-21
2011-44
2011-45
次のような年と週の番号を含むキーを持つPHP配列があります。
year-week
組み込みのksort関数を使用すると、次のように返されます。
ksort($array);
2011-21
2011-3
2011-44
2011-45
次のように数値で並べ替えることは可能ですか?
2011-3
2011-21
2011-44
2011-45
PHP> = 5.4を使用している場合は、ksort($array, SORT_NATURAL);
キーを並べ替えるために使用uksort
し、コールバックでは、を使用しますstrnatcmp
。
uksort($array, function($a,$b){
return strnatcmp($a,$b);
});
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
)
フラグksort
付きで使用できます。natural
(PHP 5.4以降のみがサポート)
ksort($array, SORT_NATURAL);
2桁の週でフォーマットすると、希望する結果が得られます。2011-03のようなもの。sprint_f()を参照してください。
もっと簡単な解決策が利用できると思いますが、私の最初の考えは次のとおりです。
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');