PHP:配列でORDER BYのように複数ソート:array_multisort
PHP (55 items)
2005年08月12日
で、その配列の内容をソートする関数もいくつか用意されていますが、
基本的には配列の「値」に対してのソート結果となります。
ここで、配列の「キー(添え字)」も含めてソートできないか?
つまり、連想配列の値とキーも含めたソートができないかと考えると、
以下の関数を使用して実現する事ができました。
>array_multisort関数
複数の多次元の配列をソートする
各フルーツの名前をキーにして、それぞれの個数を値で持ったものです。
$fruits = array(
"lemon" => "50",
"orange" => "120"
, "banana" => "10",
"apple" => "50",
"grapes" => "10"
);
で、この連想配列を値(個数)の降順に並び替え、
更にキー(フルーツ名)の昇順で並び替える、・・つまり、
ORDER BY 個数 DESC, フルーツ名 ASC
としたいとします。
この場合は、array_multisort関数の複数の配列をソートする機能で実現します。
・・ちょっと小細工入ってるんですが、方法としては、
フルーツ連想配列と同じ配列(キーとその順番が同じ)で、
値が個数ではなくフルーツ名の連想配列を用意します。
//フルーツ連想配列
$fruits = array(
"lemon" => "50",
"orange" => "120",
"banana" => "10",
"apple" => "50",
"grapes" => "10"
);
//フルーツ名連想配列
$fruitsnm = array(
"lemon" => "lemon",
"orange" => "orange",
"banana" => "banana",
"apple" => "apple",
"grapes" => "grapes"
);
で、これら2つの配列をソートします。
フルーツ連想配列は数値で降順、フルーツ名連想配列は文字列で昇順とします。
array_multisort(
$fruits, SORT_DESC, SORT_NUMERIC,
$fruitsnm, SORT_ASC, SORT_STRING
);
この後の2つの配列のソート結果は以下の通りです。
//フルーツ連想配列
$fruits {
[orange]=> 120
[apple]=> 50
[lemon]=> 50
[banana]=> 10
[grapes]=> 10
}
//フルーツ名連想配列
$fruitsnm {
[orange]=> "orange"
[apple]=> "apple"
[lemon]=> "lemon"
[banana]=> "banana"
[grapes]=> "grapes"
}
まずフルーツ連想配列のソートに従い、”orange”が一番目となります。
その後ですが、”apple”と”lemon”が同じ値「50」となってます。
なので、次はフルーツ名連想配列のソートに従い、
”apple”、”lemon”の順となります。
更に次は、フルーツ連想配列の”banana”と”grapes”ですが、
同じように同じ値なので、フルーツ名連想配列のソートに従います。
で、結局、フルーツ連想配列「$fruits」は、
”ORDER BY 個数 DESC, フルーツ名 ASC”の順で並び変りました。
フルーツ名連想配列「$fruitsnm」を作るのが小細工的ポイントですが、
こういう配列のソートをしたい時って、
なんかの処理ロジックの途中だったりしますし、
動的にフルーツ連想配列「$fruits」は作られるとしても、
それと同じタイミングで、もう1個、
フルーツ名連想配列「$fruitsnm」を作れば良い訳です。
・・ま、配列をこういう使い方するしないは別にして、
こういう事もできますねという話でした。。