こんにちは!エンジニアのオータケです!
今回は様々な場面で使うソート(並び替え)について解説します!
皆さんはPHPでコードを書いていて、「値を昇順・降順でソートしたい」「連想配列をキー名でソートしたい」といった状況に遭遇したことはありませんか?
本記事ではPHPに用意されている様々なソート関数をわかりやすく一通り解説していきたいと思います!
この記事を読めば、
・配列の値を昇順・降順で並び替える方法
・連想配列の値を昇順・降順で並び替える方法
・連想配列のキー名を昇順・降順で並び替える方法
といった内容から
・配列の値をランダムにソートする方法
・多次元配列をソートする方法
までわかりやすく解説していきます!
配列の要素をソート
sort関数で昇順に並び替え
次のような配列があるとします。
$money = [100, 50, 20, 4000];
この配列は昇順(値が小さい順)、降順(値が大きい順)のどちらでもありません。
この値をまず昇順に並び替えてみます。
並び替えるにはsort関数を使います。
早速サンプルコードを見てみましょう。
<?php $money = [100, 50, 20, 4000]; sort($money); var_dump($money); ?>
実行結果:
array(4) { [0]=> int(20) [1]=> int(50) [2]=> int(100) [3]=> int(4000) }
はい、このような形で昇順に並び替わりました。
難しくないですよね?
もしソートに成功した場合はTRUE、失敗した場合はFALSEを返します。
次の項では変数$moneyを降順に並び替えてみます。
rsort関数で降順に並び替え
先程は昇順に並び替えました。
今度は配列の値を降順に並び替えてみます。
サンプルコードを見てみましょう!
<?php $money = [100, 50, 20, 4000]; rsort($money); var_dump($money); ?>
実行結果:
array(4) { [0]=> int(4000) [1]=> int(100) [2]=> int(50) [3]=> int(20) }
配列の値を降順に並び替えることができました。
昇順の場合はsort関数、降順の場合はrsort関数を使うことで並び替えることができます!
次の章では連想配列の要素(値)をソートします。
連想配列の要素をソート
asort関数で値を昇順に並び替え
先程は連想配列ではなく通常の配列変数を並び替えました。
今回は連想配列の値を並び替えたいと思います。
サンプルコードをご覧ください。
<?php $money = ['Tarou' => 100, 'Suda' => 50, 'Nisioka' => 20, 'Mizuno' => 4000]; asort($money); var_dump($money); ?>
実行結果:
array(4) { ["Nisioka"]=> int(20) ["Suda"]=> int(50) ["Tarou"]=> int(100) ["Mizuno"]=> int(4000) }
これで連想配列の値を昇順で並び替えることができました!
ここで一つ疑問が湧きませんか?
もしこの連想配列をsort関数で並び替えたときにどういう結果になるのか・・・
ではasortをsortに変更して実行してみましょう
実行結果:
array(4) { [0]=> int(20) [1]=> int(50) [2]=> int(100) [3]=> int(4000) }
連想配列のキーが全て連番に変わってしまいました。
つまり、連想配列を並び替えたい場合はこのasortか後述するarsort関数で並び替えないとキーが壊れてしまうという問題があります。
では次に連想配列の降順の並び替え方についてみてみましょう!
arsort関数で値を降順に並び替え
使い方は先程の連想配列を昇順に並び替える際に使ったasort関数と同じです。
<?php $money = ['Tarou' => 100, 'Suda' => 50, 'Nisioka' => 20, 'Mizuno' => 4000]; arsort($money); var_dump($money); ?>
実行結果:
array(4) { ["Mizuno"]=> int(4000) ["Tarou"]=> int(100) ["Suda"]=> int(50) ["Nisioka"]=> int(20) }
こちらも連想配列のキーを壊すことなく値で降順に並び替えることができました!
ここまで配列の値を基準に昇順・降順に並び替えてきましたが次の章ではキーをもとに配列をソートします。
配列のキーをもとにソート
ksort関数で値を昇順に並び替え
この章では配列のキーをもとにして要素を並び替えます。
どういうことかイメージがつかない場合もあるかと思いますので次のサンプルをご覧ください。
<?php $money = [3 => 100, 0 => 50, 1 => 20, 2 => 4000]; var_dump($money); ksort($money); var_dump($money); ?>
実行結果:
array(4) { [3]=> int(100) [0]=> int(50) [1]=> int(20) [2]=> int(4000) } array(4) { [0]=> int(50) [1]=> int(20) [2]=> int(4000) [3]=> int(100) }
このサンプルでは最初の配列で要素番号が0からではなく3,0・・・と不規則な並びになっています。
そこでksort関数を使うと配列の要素番号を昇順に並べるため0,1,2・・・と要素番号を昇順で規則的に並び替えることができます。
krsort関数で値を降順に並び替え
先程は配列のキーを昇順に並べましたが今度は降順に並べてみます。
関数名が変わるだけでこちらも使い方は今までの関数と何らかわりません。
<?php $money = [3 => 100, 0 => 50, 1 => 20, 2 => 4000]; var_dump($money); krsort($money); var_dump($money); ?>
実行結果:
array(4) { [3]=> int(100) [0]=> int(50) [1]=> int(20) [2]=> int(4000) } array(4) { [3]=> int(100) [2]=> int(4000) [1]=> int(20) [0]=> int(50) }
先ほどとは逆でしっかり要素番号が降順になりましたね!
次の章ではshuffle関数を使って今までのような規則正しいソート方法ではなくランダムなソートについて解説していきます!
配列の要素をshuffle関数でランダムにソート
先程までは配列の値やキーについて昇順・降順と規則正しい並び替え方をしてきました。
今回はshuffle関数を使ってランダムに並び替えてみたいと思います。
では次のサンプルコードをご覧ください。
<?php $money = [ 100, 50, 20, 4000]; shuffle($money); var_dump($money); ?>
使い方自体は難しくありません。shuffle関数に並び替えたい配列を今までどおり渡しているだけです。
実行結果を見てみましょう。
実行結果:
array(4) { [0]=> int(20) [1]=> int(50) [2]=> int(4000) [3]=> int(100) }
このように値がランダムに並び替えられます。
カードゲームといったものを作る際にシャッフルしたいときなどにこの関数は有効だと思います。
次の章では多次元配列を並び替えるarray_multisort関数について解説をします。
様々なソート関数について解説してきましたが、次で最後になります!
多次元配列をarray_multisortでソート
今までは一次元配列、一次元の連想配列を並び替えるサンプルコードを提示してきました。
そこで次は多次元配列でのソート方法について学んでみましょう!
まず次のような二次元配列を用意します。
<?php $list = [ 0 => [ 'Name' => 'Tarou', 'Score' => 400 ], 1 => [ 'Name' => 'Hideyuki', 'Score' => 800 ], 2 => [ 'Name' => 'Goro', 'Score' => 10 ], 3 => [ 'Name' => 'Shun', 'Score' => 350 ], 4 => [ 'Name' => 'Katsuya', 'Score' => 280 ], 5 => [ 'Name' => 'Masahide', 'Score' => 250 ] ]; ?>
この配列は人名とスコアを一緒にした二次元配列になります。
今回はこの二次元配列のスコアを降順に並び替えたいと思います。
手順としてはまず、並び替えたいキーをforeachで抽出します。
そのあと抽出したキーを束ねた配列をarray_multisortに渡してソートします。
<?php $list = [ 0 => [ 'Name' => 'Tarou', 'Score' => 400 ], 1 => [ 'Name' => 'Hideyuki', 'Score' => 800 ], 2 => [ 'Name' => 'Goro', 'Score' => 10 ], 3 => [ 'Name' => 'Shun', 'Score' => 350 ], 4 => [ 'Name' => 'Katsuya', 'Score' => 280 ], 5 => [ 'Name' => 'Masahide', 'Score' => 250 ] ]; foreach($list as $key => $value) { $sort_keys[$key] = $value['Score']; } array_multisort($sort_keys, SORT_DESC, $list); var_dump($list); ?>
実行結果:
array(6) { [0]=> array(2) { ["Name"]=> string(5) "Tarou" ["Score"]=> int(800) } [1]=> array(2) { ["Name"]=> string(5) "Hideyuki" ["Score"]=> int(400) } [2]=> array(2) { ["Name"]=> string(5) "Goro" ["Score"]=> int(350) } [3]=> array(2) { ["Name"]=> string(5) "Shun" ["Score"]=> int(280) } [4]=> array(2) { ["Name"]=> string(5) "Katsuya" ["Score"]=> int(250) } [5]=> array(2) { ["Name"]=> string(5) "Masahide" ["Score"]=> int(10) } }
array_multisortの第一引数はforeachで抽出した配列を渡します。
第二引数には昇順または降順で並び替えるのかのフラグを渡します。
今回はスコアを降順で並び替えたいのでSORT_DESCを渡します。
第三引数には並び替えたいもととなる配列を渡すことで多次元の配列の並び替えをすることができます。
まとめ
いかがでしょうか?
配列のソート方法がいくつもあることがわかりました。
少しややこしいですが
・配列の値をソートしたいときはsort,rsort
・連想配列の値をソートしたいときはasort,arsort
・配列のキーをソートしたいときはksort,krsort
・要素の値をランダムにソートしたいときはshuffle
・多次元配列をソートしたいときはarray_multisort
を使うことで実現できます。
もし、わからなくなることがあればこの記事をまた見てくださいね!