PHPで配列をソートする関数はたくさんあります。
通常の配列であれば値の並び替えだけになります。
今回は配列のキーは意識せず、値の並び替えメインでご紹介します。
キーと値の関連を維持する必要がある連想配列のソートはこちら
目次
昇順でソート
sort関数で値をソート
1 2 3 4 5 6 7 8 |
// 配列を変数に格納 $members = array('nagasawa', 'zaizen', 'aoyama'); // sortで昇順にソート sort($members); // ソート済みの変数を出力 print_r($members); |
Array ( [0] => aoyama [1] => nagasawa [2] => zaizen )
アルファベット順に a から順に昇順でソートされましたね。
asort関数でキーと値の関連を維持しながら値をソート
asort()
はキーと値の関連を維持してくれる sort関数と言えるでしょう。
キーと値の関連が崩れては困る連想配列でよく使います。
ksort関数でキーと値の関連を維持しながらキーをソート
ksort()
はキーと値の関連を維持しながら、キー基準でソートしてくれます。
キーを自動で振る通常の配列ではあまり使わない、連想配列向けのソート関数と言えるでしょう。
降順でソート
rsort関数で値をソート
1 2 3 4 5 6 7 8 |
// 配列を変数に格納 $members = array('nagasawa', 'zaizen', 'aoyama'); // sortで昇順にソート rsort($members); // ソート済みの変数を出力 print_r($members); |
Array ( [0] => zaizen [1] => nagasawa [2] => aoyama )
今度は逆にアルファベットの逆順でz
から順に降順でソートされました。
arsort関数でキーと値の関連を維持しながら値をソート
arsort()
はキーと値の関連を維持してくれる rsort関数と言えるでしょう。
キーと値の関連が崩れては困る連想配列でよく使います。
krsort関数でキーと値の関連を維持しながらキーをソート
ksort()
はキーと値の関連を維持しながら、キー基準で逆順にソートしてくれます。
キーを自動で振る通常の配列ではあまり使わない、連想配列向けのソート関数と言えるでしょう。
配列の並び順をランダムにソート
shuffle関数でランダムにソート
1 2 3 4 5 6 7 8 |
// 配列を変数に格納 $members = array('nagasawa', 'zaizen', 'aoyama'); // sortで昇順にソート shuffle($members); // ソート済みの変数を出力 print_r($members); |
Array ( [0] => nagasawa [1] => aoyama [2] => zaizen )
↓リロードするたびにシャッフル
Array ( [0] => aoyama [1] => zaizen [2] => nagasawa )
↓リロードするたびにシャッフル
Array ( [0] => zaizen [1] => aoyama [2] => nagasawa )
配列の値をランダムにソートしました。
リロードのたびに毎回シャッフルしてくれるので、スロットマシーンなどにも使えますね(笑)
配列を自然順でソート
以下2つの関数は、キーと値の関連を維持したままソートされるので、連想配列でも使えます。
natsort関数でより自然にソート
自然順とは人間が並べる、より自然なソートです。
数字混じりの値をソートしたときに、人間とコンピューターでは差が出ます。
以下のサンプルで比較してみましょう。
1 2 3 4 5 6 7 8 9 10 |
// 配列を変数に格納 $id = array('text1.txt', 'text11.txt', 'text2.txt', 'text21.txt'); // 通常のソート sort($id); print_r($id); // natsortで自然にソート natsort($id); print_r($id); |
通常のソート
Array ( [0] => text1.txt [1] => text11.txt [2] => text2.txt [3] => text21.txt )
natsortで自然にソート
Array ( [0] => text1.txt [2] => text2.txt [1] => text11.txt [3] => text21.txt )
数字が混じったファイルをソートしていますが、よく見ると通常のソートは以下のようになっていますね。
text1.txt→text11.txt→text2.txt→text21.txt
「1 → 11 → 2 → 21」と並んでおり、これでは順番にソートしたとは言えないでしょう。
こういった桁数不揃いの数字が混じったソートにはnatsort()
が適していますね。
負の数字や0
を先頭にした数字などでも並び順が通常だとおかしいので、natsort()
を使うと良いでしょう。
natcasesort関数で大文字・小文字を区別せず自然順にソート
先ほどのnatsort()
でも大文字・小文字が混ざると、大文字から先に並ぶため、順番にソートされません。
そこで、このnatcasesort()
を使えば大文字・小文字に関わらず、順番にソートされます。
1 2 3 4 5 6 7 8 9 10 |
// 配列を変数に格納 $id = array('text1.txt', 'TEXT11.txt', 'text2.txt', 'TEXT21.txt'); // natsortでソート natsort($id); print_r($id); // natcasesortで大文字・小文字を区別せずソート natcasesort($id); print_r($id); |
natsortでソート
Array ( [1] => TEXT11.txt [3] => TEXT21.txt [0] => text1.txt [2] => text2.txt )
natcasesortで大文字・小文字区別せずソート
Array ( [0] => text1.txt [2] => text2.txt [1] => TEXT11.txt [3] => TEXT21.txt )
natsort()
だと、大文字から先に並び、そのあとで小文字が並んでいます。
natcasesort()
では、大文字小文字に関わらず、ソートされていますね。
大文字・小文字混じりの配列の場合natcasesort()
を使いましょう。
配列のソートまとめ
それではさまざまなソートの関数をまとめてみましょう。
配列ソートの関数一覧表
関数 | ソート順 | ソートの基準 | キーと値の関係 |
---|---|---|---|
sort | 昇順 | 値 | 維持しない |
asort | 昇順 | 値 | 維持する |
ksort | 昇順 | キー | 維持する |
rsort | 降順 | 値 | 維持しない |
arsort | 降順 | 値 | 維持する |
krsort | 降順 | キー | 維持する |
shuffle | ランダム | 値 | 維持しない |
natsort | 自然順 | 値 | 維持する |
natcasesort | 大文字・小文字区別しない自然順 | 値 | 維持する |
usort | ユーザー定義 | 値 | 維持しない |
uasort | ユーザー定義 | 値 | 維持する |
uksort | ユーザー定義 | キー | 維持する |
array_multisort | 最初の配列またはソートオプション | 値 | 連想配列=>維持する 配列=>維持しない |
ユーザー定義によるソートはワンランクアップしますので、また別項でお伝えします。
配列ソートの関数の構文
関数( ソートしたい連想配列 (, ソートフラグ(省略可)) );
※natsort()
natcasesort()
shuffle()
にはソートフラグは設定できません。
※usort()
uasort()
uksort()
にはソートフラグはなく、代わりにユーザー定義関数が入ります。
この関数はブーリアン型なので、以下のようにtrue
かfalse
を返します。
- 成功したら
true
を返す - 失敗したら
false
を返す
そのため、出力時にこれらソート関数を一緒に記述するとtrue
が返されるだけになるので、ソートと出力は分けて記述しましょう。
مرحبا