PHPで配列をソートする方法一覧
PHPで配列を並び替える(ソートする)時に使用できる関数についてまとめました。
すべての関数に実行サンプルコードも合わせて載せていますので、用途に応じて確認してください。
ソートの方向「昇順」と「降順」の違いと覚え方
まずは配列のソートで頻発する用語、「昇順」と「降順」について100%理解しておきましょう。
- 小さい順⇒昇順
- 大きい順⇒降順
昇順と降順は階段をイメージして頂くと分かりやすいです。
昇順は階段を上る、つまり0段目から1段、2段と上っていくので、数え方は少ない数字から、すなわち小さい順に並び替えます。
逆に降順は5段目から4段目、3段目と下っていくので、数え方は大きい数字から、つまり大きい順という意味です。
値でソートする(キーは連番)
配列の値のソートは、昇順はsort()、降順はrsort()という関数を使用します。
sort(昇順)
$aryHoge = [100, 50, 500, 200, 10000]; sort($aryHoge); print_r($aryHoge);
(
[0] => 50
[1] => 100
[2] => 200
[3] => 500
[4] => 10000
)
rsort(降順)
$aryHoge = [100, 50, 500, 200, 10000]; rsort($aryHoge); print_r($aryHoge);
(
[0] => 10000
[1] => 500
[2] => 200
[3] => 100
[4] => 50
)
【注意】キー(添え字)は自動的に連番に変更される
sort()、rsort()は値のソート時に、自動的にキーが連番に変更されてしまいます。
キーが変更されてしまうため、キーに文字列を含む連想配列でこのソートを行うと、文字列が消滅します。
$aryHoge = ['Tanaka' => 100, 'Suzuki' => 50, 'Yamada' => 500, 'Aoki' => 200, 'Fujita' => 10000]; sort($aryHoge); print_r($aryHoge); //キーの文字列が消滅している
(
[0] => 50
[1] => 100
[2] => 200
[3] => 500
[4] => 10000
)
連想配列のように、キーと値の関係性を保持した上でソートを行いたい場合は、後述のasort()、arsort()、ksort()、krsort()を使用します。
値でソートする(キーと値の相互関係を保持)
キーと値の関係性を保持したまま、値のソートを行いたい場合はasort(昇順)、arsort(降順)を使用します。
主に連想配列で、キーと値の関係を崩したくない状態でソートを行うのに便利です。
asort(昇順)
$aryHoge = ['Tanaka' => 100 ,'Suzuki' => 50 ,'Yamada' => 500 ,'Aoki' => 200 ,'Fujita' => 10000]; asort($aryHoge); print_r($aryHoge);
(
[Suzuki] => 50
[Tanaka] => 100
[Aoki] => 200
[Yamada] => 500
[Fujita] => 10000
)
arsort(降順)
$aryHoge = ['Tanaka' => 100 ,'Suzuki' => 50 ,'Yamada' => 500 ,'Aoki' => 200 ,'Fujita' => 10000]; arsort($aryHoge); print_r($aryHoge);
(
[Fujita] => 10000
[Yamada] => 500
[Aoki] => 200
[Tanaka] => 100
[Suzuki] => 50
)
キーでソートする(キーと値の相互関係を保持)
配列のキーでソートを行いたい場合はksort(昇順)、krsort(降順)を使用します。
値との関係性も保持されるため、連想配列での使用も安心です。
ksort(昇順)
$aryHoge = ['Tanaka' => 100 ,'Suzuki' => 50 ,'Yamada' => 500 ,'Aoki' => 200 ,'Fujita' => 10000]; ksort($aryHoge); print_r($aryHoge);
(
[Aoki] => 200
[Fujita] => 10000
[Suzuki] => 50
[Tanaka] => 100
[Yamada] => 500
)
krsort(降順)
$aryHoge = ['Tanaka' => 100 ,'Suzuki' => 50 ,'Yamada' => 500 ,'Aoki' => 200 ,'Fujita' => 10000]; krsort($aryHoge); print_r($aryHoge);
(
[Yamada] => 500
[Tanaka] => 100
[Suzuki] => 50
[Fujita] => 10000
[Aoki] => 200
)
キーの文字列がしっかりアルファベット順でソートされていることが分かります。
多次元配列をソートするarray_multisort
配列の中に配列を含む多次元配列のソートはarray_multisort()関数を使用します。
array_multisortを使用するにあたって、foreachでソートしたい項目を取り出し配列を生成する処理が必要になります。
$aryHoge = [ 0 => ['name' => 'Tanaka', 'Sugaku' => 100, 'Eigo' => 100], 1 => ['name' => 'Suzuki', 'Sugaku' => 70, 'Eigo' => 100], 2 => ['name' => 'Yamada', 'Sugaku' => 80, 'Eigo' => 100], 3 => ['name' => 'Aoki', 'Sugaku' => 85, 'Eigo' => 90], 4 => ['name' => 'Fujita', 'Sugaku' => 60, 'Eigo' => 80] ]; //foreachでソートしたい値を取り出す $arySort = []; foreach($aryHoge as $key => $value){ $arySort[$key] = $value['Sugaku']; } //昇順に並び替える array_multisort($arySort, SORT_ASC, $aryHoge); //降順の場合はSORT_DESCに変更 //array_multisort($arySort, SORT_DESC, $aryHoge); print_r($aryHoge);
(
[0] => Array
(
[name] => Fujita
[Sugaku] => 60
[Eigo] => 80
)
[1] => Array
(
[name] => Suzuki
[Sugaku] => 70
[Eigo] => 100
)
[2] => Array
(
[name] => Yamada
[Sugaku] => 80
[Eigo] => 100
)
[3] => Array
(
[name] => Aoki
[Sugaku] => 85
[Eigo] => 90
)
[4] => Array
(
[name] => Tanaka
[Sugaku] => 100
[Eigo] => 100
)
)
「Sugaku」の昇順になっていることが分かります。
複数の値でソートを行いたい場合(同率順位処理)
array_multisortは複数の配列を指定することが出来ます。
もし、「英語の点数の高い順、同率の場合は数学の高い順」としてソートしたい場合は、foreachで複数の配列を取得しておく必要があります。
$aryHoge = [ 0 => ['name' => 'Tanaka', 'Sugaku' => 100, 'Eigo' => 100], 1 => ['name' => 'Suzuki', 'Sugaku' => 70, 'Eigo' => 100], 2 => ['name' => 'Yamada', 'Sugaku' => 80, 'Eigo' => 100], 3 => ['name' => 'Aoki', 'Sugaku' => 85, 'Eigo' => 90], 4 => ['name' => 'Fujita', 'Sugaku' => 60, 'Eigo' => 80] ]; //foreachでソートしたい値を取り出す $arySortEi = []; $arySortSu = []; foreach($aryHoge as $key => $value){ $arySortEi[$key] = $value['Eigo']; $arySortSu[$key] = $value['Sugaku']; } //英語の高い順、数学の高い順の優先度でソート array_multisort( $arySortEi, SORT_DESC, $arySortSu, SORT_DESC, $aryHoge ); print_r($aryHoge);
(
[0] => Array
(
[name] => Tanaka
[Sugaku] => 100
[Eigo] => 100
)
[1] => Array
(
[name] => Yamada
[Sugaku] => 80
[Eigo] => 100
)
[2] => Array
(
[name] => Suzuki
[Sugaku] => 70
[Eigo] => 100
)
[3] => Array
(
[name] => Aoki
[Sugaku] => 85
[Eigo] => 90
)
[4] => Array
(
[name] => Fujita
[Sugaku] => 60
[Eigo] => 80
)
)
PHP5.5以上の方の便利なソート方法
PHP5.5からはarray_columnという便利な記述が使えます。
array_columnは、指定したカラムのみの配列を返してくれるため、foreachの繰り返しで配列を生成する下準備を不要にできます。
$aryHoge = [ 0 => ['name' => 'Tanaka', 'Sugaku' => 100, 'Eigo' => 100], 1 => ['name' => 'Suzuki', 'Sugaku' => 70, 'Eigo' => 100], 2 => ['name' => 'Yamada', 'Sugaku' => 80, 'Eigo' => 100], 3 => ['name' => 'Aoki', 'Sugaku' => 85, 'Eigo' => 90], 4 => ['name' => 'Fujita', 'Sugaku' => 60, 'Eigo' => 80] ]; //数学の昇順 この一行で済む array_multisort(array_column($aryHoge, 'Sugaku'), SORT_ASC, $aryHoge); print_r($aryHoge);
(
[0] => Array
(
[name] => Fujita
[Sugaku] => 60
[Eigo] => 80
)
[1] => Array
(
[name] => Suzuki
[Sugaku] => 70
[Eigo] => 100
)
[2] => Array
(
[name] => Yamada
[Sugaku] => 80
[Eigo] => 100
)
[3] => Array
(
[name] => Aoki
[Sugaku] => 85
[Eigo] => 90
)
[4] => Array
(
[name] => Tanaka
[Sugaku] => 100
[Eigo] => 100
)
)
まとめ
今回紹介した各種ソート系の配列をまとめました。
ソートの対象 | ソートの向き | キーと値の関係 | |
---|---|---|---|
sort | 値 | 昇順 | 破棄 |
rsort | 値 | 降順 | 破棄 |
asort | 値 | 昇順 | 維持 |
arsort | 値 | 降順 | 維持 |
ksort | キー | 昇順 | 維持 |
krsort | キー | 降順 | 維持 |
これらのソート系関数に加えて、多次元配列に対応した「array_multisort」は覚えておきましょう。
以上、PHPで配列をソートする方法一覧、でした。
ディスカッション
コメント一覧
まだ、コメントがありません