【PHP】配列の要素の値を昇順、降順に並べ替える関数「sort()」「rsort()」
今回はPHPで配列の要素を値によって昇順と降順に並べ替える関数、「sort()」と「rsort()」について記述します。
昇順、降順に並べ替えるというシンプルな機能でありながら、中々に扱いが難しい側面があると感じる関数です。
目次
配列内の要素を値によって昇順に並べ替える「sort()」
|
1 |
sort(昇順に並べ替えたい配列[,ソートフラグ]); |
それでは以下のサンプルで「sort()」の使い方を見てみましょう。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php //sort(昇順に並べ替えたい配列[,ソートフラグ]); $arraynum = array(3,2,5,1,4,2); $arrayword = array("い","あ","え","お","う","あ"); $array = array("i",3,"い","あ","う",2,1,"a","u"); sort($arraynum); sort($arrayword); sort($array); print_r($arraynum); print_r($arrayword); print_r($array); ?> //実行結果 Array ( [0] => 1 [1] => 2 [2] => 2 [3] => 3 [4] => 4 [5] => 5 ) //$arraynum Array ( [0] => あ [1] => あ [2] => い [3] => う [4] => え [5] => お ) //$arrayword Array ( [0] => a [1] => i [2] => u [3] => あ [4] => い [5] => う [6] => 1 [7] => 2 [8] => 3 ) //$array |
「$arraynum」は「数値だけの配列」、「$arrayword」は「文字列だけの配列」、「$array」は「文字列と数値が混在した配列」でソートさせてみました。それぞれ昇順で並び替えられていることが確認できると思います。
「文字列と数値が混在した配列」では「文字列英数字 → 文字列(日本語) → 数値」の順番に並び替えられます。この並び方の規則は第2引数のソートフラグによって変更できるのですが、ここがちょっと今の私では扱い切れていません( ;∀;)
配列内の要素を値によって降順に並べ替える「rsort()」
|
1 |
rsort(降順に並べ替えたい配列[,ソートフラグ]); |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php //rsort(降順に並べ替えたい配列[,ソートフラグ]); $arraynum = array(3,2,5,1,4,2); $arrayword = array("い","あ","え","お","う","あ"); $array = array("i",3,"い","あ","う",2,1,"a","u"); rsort($arraynum); rsort($arrayword); rsort($array); print_r($arraynum); print_r($arrayword); print_r($array); //実行結果 Array ( [0] => 5 [1] => 4 [2] => 3 [3] => 2 [4] => 2 [5] => 1 ) // $arraynum Array ( [0] => お [1] => え [2] => う [3] => い [4] => あ [5] => あ ) //$arrayword Array ( [0] => 3 [1] => 2 [2] => 1 [3] => う [4] => い [5] => あ [6] => u [7] => i [8] => a ) //$array ?> |
このあたりは第2引数で調整が可能…なのですが…ここがやはり難しく今の私には上手くできないです;;
注意点:「sort()」、「rsort」はインデックスキーを保持しない
さて、ここまで「sort()」と「rsort()」について基本的な使い方を見てきましたが、ここで注意点があります。
それはこの二つの関数は「インデックスキーを保持しない」ということです。
サンプルコードでもう一度確認してみましょう。
|
1 2 3 4 5 6 7 8 9 10 11 |
<?php $arraynum = array(3,2,5,1,4,2); print_r($arraynum); sort($arraynum); print_r($arraynum); rsort($arraynum); print_r($arraynum); ?> |
実行結果は以下のとおりです。
|
1 2 3 4 |
Array ( [0] => 3 [1] => 2 [2] => 5 [3] => 1 [4] => 4 [5] => 2 ) //ソート前 Array ( [0] => 1 [1] => 2 [2] => 2 [3] => 3 [4] => 4 [5] => 5 ) //sort後 Array ( [0] => 5 [1] => 4 [2] => 3 [3] => 2 [4] => 2 [5] => 1 ) //rsort後 |
並べ替え前と並べ替え後のインデックスキーを確認してみると、変更後は元々もっていたインデックスキーが別の数値に変わっており、並び替えと同時に数値が降り直されていることが分かります。これは「sort()」と「rsort()」がソートした際に「インデックスキーを保持せず、振り直す」という特性を持っているためです。その為、連想配列に使用した際に問題が発生します。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php $arraynum = array("田中" => 3,"鈴木" => 2,"高木" => 5,"田原" => 1,"坂内" => 4,"塚本" => 2); print_r($arraynum); sort($arraynum); print_r($arraynum); rsort($arraynum); print_r($arraynum); ?> |
実行結果は
|
1 2 3 4 |
Array ( [田中] => 3 [鈴木] => 2 [高木] => 5 [田原] => 1 [坂内] => 4 [塚本] => 2 ) //ソート前 Array ( [0] => 1 [1] => 2 [2] => 2 [3] => 3 [4] => 4 [5] => 5 ) //sort後 Array ( [0] => 5 [1] => 4 [2] => 3 [3] => 2 [4] => 2 [5] => 1 ) //rsort後 |
このように、連想配列として保有していたキーが全て振り直されるため、「sort()」と「rsort()」は連想配列には使用できないことが分かります。
連想配列やインデックスキーを保持した状態で並べ替えたい場合は「asort()」と「arsort()」を使用する必要があります。
このように並べ替えるだけと思っても、関数にそれぞれ特徴があり、組みたいプログラムによって使い分けなければならないところが難しいかなぁっと個人的には感じてます。
まとめ
- 要素を値によって昇順に並べ替えたい時は「sort()」を使用する
- 要素を値によって降順に並べ替えたい時は「rsort()」を使用する
- 「sort()」、「rsort()」はインデックスキーを保持しない為、連想配列には使えない