PHPの連想配列をソートする際、キーでソート、値でソートとそれぞれ関数が用意されています。
しかも昇順と降順でも関数がそれぞれ用意されており、それぞれをご紹介します。
データベースから引っ張ったデータをソートしたり、ランキングに用いたりとよく使うので、適切な関数を用いてソートをマスターしましょう。
目次
値基準でソートする
asort関数で昇順ソート
1 2 3 4 5 6 7 8 |
// 連想配列を配列に格納 $members = array('01'=>'nagasawa','02'=>'kitagawa','03'=>'tanaka'); // asortで値を昇順でソート asort($members); // ソート済みの変数を出力 print_r($members); |
[02] => kitagawa
[01] => nagasawa
[03] => tanaka
値のアルファベットを基準に昇順でソートされました。
昇順ですので、アルファベットは「A→Z」、日付は「古い→新しい」、数字は「小さい→大きい」となりますね。
階段を思い浮かべると良いでしょう。
昇順→階段を昇るので「1階、2階、3階…」と続きますね。
arsort関数で降順ソート
1 2 3 4 5 6 7 8 |
// 連想配列を変数に格納 $members = array('01'=>'nagasawa','02'=>'kitagawa','03'=>'tanaka'); // arsortで値を降順でソート arsort($members); // ソート済みの変数を出力 print_r($members); |
[03] => tanaka
[01] => nagasawa
[02] => kitagawa
先ほどの逆順で並びましたね。
値基準で逆順なので、値の頭文字が「Z」に一番近いtanaka
が先頭に並びました。
キー基準でソートする
ksort関数で昇順ソート
1 2 3 4 5 6 7 8 |
// 連想配列を変数に格納 $members = array('01'=>'nagasawa','02'=>'kitagawa','03'=>'tanaka'); // ksortでキーを昇順でソート ksort($members); // ソート済みの変数を出力 print_r($members); |
[01] => nagasawa
[02] => kitagawa
[03] =>tanaka
今度はキー基準で["01"]
から順番に並んでくれました。
krsort関数で降順ソート
1 2 3 4 5 6 7 8 |
// 連想配列を変数に格納 $members = array('01'=>'nagasawa','02'=>'kitagawa','03'=>'tanaka'); // krsortでキーを降順でソート krsort($members); // ソート済みの変数を出力 print_r($members); |
[03] => tanaka
[02] => kitagawa
[01] => nagasawa
先ほどとは逆で、キーを基準に降順に並びました。
キーと値のソートまとめ
いろいろ似たような関数が出てきたので、整理してみましょう。
連想配列ソート関数一覧
関数 | ソートの基準 | ソート順 |
---|---|---|
asort | 値 | 昇順 |
arsort | 値 | 降順 |
ksort | キー | 昇順 |
krsort | キー | 降順 |
連想配列ソート関数の覚え方
値基準とキー基準のどっちがasort()
だったか忘れそうになりませんか?
忘れないように以下のように覚えましょう。
- 値基準 → 値の頭文字「a」で「asort」
- キー基準 → キーの頭文字「k」で「ksort」
- 降順 → 「sort」の前に「r」を付ける(値基準の場合:「arsort」)
これでもう忘れませんね…(汗)?
連想配列ソート関数の構文
関数( ソートしたい連想配列 (, ソートフラグ(省略可)) );
この関数はブーリアン型なので、以下のようにtrue
かfalse
を返します。
- 成功したら
true
を返す - 失敗したら
false
を返す
そのため、出力時にこれらソート関数を一緒に記述するとtrue
が返されるだけになるので、ソートと出力は分けて記述しましょう。
array_multisort関数
多次元連想配列の特定の列でソートする
なんかややこしそうなのが出てきました。
これはデータベースから値を引っ張ってきた時によく使います。
例えば以下のようなテーブルから引っ張ってきたとしましょう。
id|name
———–
3|nagasawa
1|kitagawa
2|tanaka
上記の表をid順に並べ替えてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// 多次元連想配列を変数に格納 $members = array( array('id'=>3,'name'=>'nagasawa'), array('id'=>1,'name'=>'kitagawa'), array('id'=>2,'name'=>'tanaka') ); // foreachで1つずつ値を取り出す foreach ($members as $key => $value) { $id[$key] = $value['id']; } // array_multisortで'id'の列を昇順に並び替える array_multisort($id, SORT_ASC, $members); // ソート済みの変数を出力 print_r($members); |
[0] => Array (
[id] => 1
[name] => kitagawa
)
[1] => Array (
[id] => 2
[name] => tanaka
)
[2] => Array (
[id] => 3
[name] => nagasawa
)
‘id’基準で並び変わってくれましたね。
array_multisortの構文
array_multisort()
は以下のような構文で成り立っています。
array_multisort(並び替えの基準, 並び替え順, 並び替えたい配列);
並び替え順は以下の引数です。
- 昇順:SORT_ASC
- 降順:SORT_DESC
ではforeach()
では何をやっているかというと、idだけを抜き出して$id[$key]
という変数に繰り返し処理で格納しています。
そしてarray_multisort()
で昇順に並び替えているのです。
id=>3
を$id[$key]
に格納id=>1
を$id[$key]
格納id=>2
を$id[$key]
格納
この時点で[3,1,2]という配列が完成
あとはarray_multisort()
で[3,1,2]という配列を[1,2,3]と昇順でソートすることで、値もキーに連動して並び替えが完成するのです。
このロジックはちょっと分かりにくいですが、実際にコードを書いてみると良いでしょう。