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をコピーしました