Web Artisan Blog - ウェブ アルチザン ブログ

PHP:配列でORDER BYのように複数ソート:array_multisort

PHP (55 items)

2005年08月12日

PHPには強力な配列操作関数がいくつもあります。
で、その配列の内容をソートする関数もいくつか用意されていますが、
基本的には配列の「値」に対してのソート結果となります。

ここで、配列の「キー(添え字)」も含めてソートできないか?
つまり、連想配列の値とキーも含めたソートができないかと考えると、
以下の関数を使用して実現する事ができました。

>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」を作れば良い訳です。


・・ま、配列をこういう使い方するしないは別にして、
こういう事もできますねという話でした。。

前の記事 次の記事

Comments

コメントは、まだ書かれていません

Add Comments

Trackback

トラックバックはありません

Trackback URL

http://www.res-system.com/weblog/action.php?action=plugin&name=TrackBack&tb_id=508