PHPでソートする方法と関数の違いは?(sort, asort, ksort)

PHP

PHPで配列に入れたデータをソート(並び替え)する関数について書いています。

PHPの標準で用意されている関数を使用して、ソートの検証を行ってみています。
ここで、使用してみた関数は下記になります。(公式を確認してシンプルなものだけ検証してみました)

・sort
・rsort
・asort
・arsort
・ksort
・krsort

記事には、それぞれの関数の挙動やソート内容をわかりやすく書いてみました。
載せているサンプルコードはPHPのバージョン8で検証しています。

PHPでソートするときに気をつけること

PHPでデータをソートするときに標準で用意されている関数が複数あります。
使う関数によって、配列のキーでソートしたり、値でソートしたりと挙動が変わるため注意が必要です。

こちらの公式ドキュメントに詳しく書いてあります。

今回使用する関数のみ抜き出してまとめると、下記のようになります。

関数 ソートの基準 キーと値の相関関係 ソート順
sort 維持しない 昇順
rsort 維持しない 降順
asort 維持する 昇順
arsort 維持する 降順
ksort キー 維持する 昇順
krsort キー 維持する 降順

rがついている関数が降順になっています。

・`sort`の降順版が`rsort`
・`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のソート関数について長々と書きましたが、いかがでしたでしょうか。
同じように使うことができますが、関数によって結果が変わってくることが確認できました。

最初に表にまとめましたが、違いをまとめると下記のようになります。

・sortは「キーを維持せず」に「値の昇順」に並べる。(rsortはsortの降順バージョン)
・asortは「キーを維持」して「値の昇順」に並べる。(arsortはasortの降順バージョン)
・ksortは「キーを維持」して「キーの昇順」に並べる。(krsortはksortの降順バージョン)

使用するときは、挙動の違いに気をつけて使っていきましょう。

コメント

タイトルとURLをコピーしました