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が返されるだけになるので、ソートと出力は分けて記述しましょう。

مرحبا