PHPで配列に入れたデータをソート(並び替え)する関数について書いています。
PHPの標準で用意されている関数を使用して、ソートの検証を行ってみています。
ここで、使用してみた関数は下記になります。(公式を確認してシンプルなものだけ検証してみました)
・rsort
・asort
・arsort
・ksort
・krsort
記事には、それぞれの関数の挙動やソート内容をわかりやすく書いてみました。
載せているサンプルコードはPHPのバージョン8で検証しています。
PHPでソートするときに気をつけること
PHPでデータをソートするときに標準で用意されている関数が複数あります。
使う関数によって、配列のキーでソートしたり、値でソートしたりと挙動が変わるため注意が必要です。
こちらの公式ドキュメントに詳しく書いてあります。
今回使用する関数のみ抜き出してまとめると、下記のようになります。
関数 | ソートの基準 | キーと値の相関関係 | ソート順 |
---|---|---|---|
sort | 値 | 維持しない | 昇順 |
rsort | 値 | 維持しない | 降順 |
asort | 値 | 維持する | 昇順 |
arsort | 値 | 維持する | 降順 |
ksort | キー | 維持する | 昇順 |
krsort | キー | 維持する | 降順 |
r
がついている関数が降順になっています。
・`asort`の降順版が`arsort`
・`ksort`の降順版が`krsort`
関数ごとの違いとしては、表にある通り、下記で挙動が変わってきます。
・キーと値の関係を維持するか
・昇順・降順のどちらか
パッとみた感じだと、キーと値の相関関係がよくわからないと思いますが、それぞれの関数について挙動を確認していきましょう。
sort関数を使用してソートする
sort関数を使うときは、sort関数に対して、並び替えたい配列の変数を渡します。
参照渡しになっているので、関数を実行した後に渡した配列が並び替えられた状態になります。
下記のように$fruits
という連想配列を作成して並び替えてみました。
<?php
$fruits = [
1 => 'orange',
2 => 'grape',
3 => 'apple',
4 => 'peach',
5 => 'banana',
];
sort($fruits);
print_r($fruits);
print_rを使用して出力しています。
実行結果は下記のようになります。
Array
(
[0] => apple
[1] => banana
[2] => grape
[3] => orange
[4] => peach
)
apple
,banana
, grape
… といった形で値の昇順で並ぶことが確認できました。
このように配列をsort関数に渡した後は、すぐに並び替えられて、配列を格納している変数の内容が変わります。
そして、連想配列のキーが0から振り直されていることが確認できます。
これが、「キーと値の相関関係」を「維持しない」という意味になります。
sort関数に配列を渡す
連想配列を渡しましたが、下記のように配列を渡すことも可能です。
<?php
$score = [100, 50, 60, 30, 10 ,20];
sort($score);
print_r($score);
結果として、下記のようになります。
Array
(
[0] => 10
[1] => 20
[2] => 30
[3] => 50
[4] => 60
[5] => 100
)
昇順に並びました。
rsort関数を使用してソートする
同じようにrsort
関数を使用して、ソートします。
こちらも配列を渡すと、並び替えてくれます。
rsort
関数は値の降順に並べます。
先ほどのsort
関数をrsort
関数に変えてみました。
<?php
$fruits = [
1 => 'orange',
2 => 'grape',
3 => 'apple',
4 => 'peach',
5 => 'banana',
];
rsort($fruits);
print_r($fruits);
結果として、下記が出力されます。
Array
(
[0] => peach
[1] => orange
[2] => grape
[3] => banana
[4] => apple
)
今度はrsort
なので、値の降順で出力されました。
キーも0から振り直されていますね。
rsort関数に配列を渡す
先ほどと同じように、配列を渡してみます。
<?php
$score = [100, 50, 60, 30, 10 ,20];
rsort($score);
print_r($score);
結果として、下記のようになります。
Array
(
[0] => 100
[1] => 60
[2] => 50
[3] => 30
[4] => 20
[5] => 10
)
降順に並びました。
asort関数を使用してソートする
asort
関数も同じように使用することが可能です。
配列を渡すと並び替えてくれます。
sort
関数との違いは、キーを「維持する」ということです。
sort
関数を使用した時の同じ配列に対して、asort
関数を使ってみました。
<?php
$fruits = [
1 => 'orange',
2 => 'grape',
3 => 'apple',
4 => 'peach',
5 => 'banana',
];
asort($fruits);
print_r($fruits);
結果として、下記のように「キーが維持された」状態で並び替えられます。
Array
(
[3] => apple
[5] => banana
[2] => grape
[1] => orange
[4] => peach
)
asort関数に配列を渡す
配列を渡した場合も「キーが維持」されます。
特に連想配列のようにキーを指定していない場合は、0番目から配列のキーになります。
0番目が100、1番目が50、2番目が60… といった形です。
<?php
$score = [100, 50, 60, 30, 10 ,20];
asort($score);
print_r($score);
結果として、下記のように「キーが維持」された形で、昇順に並びます。
Array
(
[4] => 10
[5] => 20
[3] => 30
[1] => 50
[2] => 60
[0] => 100
)
arsort関数を使用してソートする
asort
関数は昇順でしたが、r
がついているため降順になります。
同じように配列を渡すと並び替えてくれます。
値の降順に並んで、先ほどのasort
と同じように「キーが維持」されます。
<?php
$fruits = [
1 => 'orange',
2 => 'grape',
3 => 'apple',
4 => 'peach',
5 => 'banana',
];
arsort($fruits);
print_r($fruits);
結果として、下記のようにキーが維持された状態で、値の降順に並びます。
Array
(
[4] => peach
[1] => orange
[2] => grape
[5] => banana
[3] => apple
)
arsort関数に配列を渡す
配列を渡す場合も、asort
関数と同じようにキーが維持されます。
<?php
$score = [100, 50, 60, 30, 10 ,20];
arsort($score);
print_r($score);
結果として、下記のようにキーが維持された状態で、値の降順に並びます。
Array
(
[0] => 100
[2] => 60
[1] => 50
[3] => 30
[5] => 20
[4] => 10
)
ksort関数を使用してソートする
ksort
関数もsort
関数と同じように使用できます。
sort
関数と違うところは、ソートの基準が「キー」になることです。
sort
(rsort
)・asort
(arsort
)は値で並び替えていました。
ksort
は「キー」で並び替えます。
わかりやすいように連想配列の内容を変えてみました。
<?php
$foods = [
2 => 'pizza',
4 => 'sushi',
6 => 'hamburger',
5 => 'ramen',
1 => 'curry',
];
ksort($foods);
print_r($foods);
結果として、下記のように「キーの昇順」で並び替えられます。
Array
(
[1] => curry
[2] => pizza
[4] => sushi
[5] => ramen
[6] => hamburger
)
ksort関数に配列を渡す
配列を渡す場合、キーの昇順に並び替えるので、結果に変わりがありません。
<?php
$score = [100, 50, 60, 30, 10 ,20];
ksort($score);
print_r($score);
配列のキーが「0番目が100、1番目が50、2番目が30」という形で、最初から昇順です。
なので、結果変わらず、下記のようになります。
Array
(
[0] => 100
[1] => 50
[2] => 60
[3] => 30
[4] => 10
[5] => 20
)
krsort関数を使用してソートする
ksort
関数の降順バージョンです。
krsort
を使用することで、「キーの降順」で並び替えられます。
<?php
$foods = [
2 => 'pizza',
4 => 'sushi',
6 => 'hamburger',
5 => 'ramen',
1 => 'curry',
];
krsort($foods);
print_r($foods);
結果として、下記のように「キーの降順」で並び替えられます。
Array
(
[6] => hamburger
[5] => ramen
[4] => sushi
[2] => pizza
[1] => curry
)
krsort関数に配列を渡す
配列を渡した場合ですが、キーは「0, 1, 2」とつくため、単純に逆順になります。
下記のように配列を渡して、krsort
関数を使用します。
<?php
$score = [100, 50, 60, 30, 10 ,20];
krsort($score);
print_r($score);
結果として、キーの降順に並ぶため、逆になります。
Array
(
[5] => 20
[4] => 10
[3] => 30
[2] => 60
[1] => 50
[0] => 100
)
終わりに
PHPのソート関数について長々と書きましたが、いかがでしたでしょうか。
同じように使うことができますが、関数によって結果が変わってくることが確認できました。
最初に表にまとめましたが、違いをまとめると下記のようになります。
・asortは「キーを維持」して「値の昇順」に並べる。(arsortはasortの降順バージョン)
・ksortは「キーを維持」して「キーの昇順」に並べる。(krsortはksortの降順バージョン)
使用するときは、挙動の違いに気をつけて使っていきましょう。
コメント