PHPで連想配列をソートする方法について

採用はこちら

PHPで連想配列をソートする場合は、何を基準に並べ替えるかによって使用する関数が異なります。

主に使われるのは、値を基準にソートするasort()arsort()と、キーを基準にソートするksort()krsort()です。

連想配列ではキーと値の対応関係に意味があることが多いため、ソート後もキーを維持できる関数を選ぶことが重要です。

代表的な関数は次のとおりです。

関数ソート基準並び順キーを維持
asort()昇順する
arsort()降順する
ksort()キー昇順する
krsort()キー降順する

たとえば、次のような連想配列があるとします。

$prices = [
    'apple' => 300,
    'orange' => 200,
    'banana' => 100
];

この配列を値の小さい順に並べるのか、キーのアルファベット順に並べるのかによって、使用する関数を使い分けます。

目次

値を昇順にソートするasort()

asort()の基本的な使い方

連想配列の値を昇順に並べたい場合は、asort()を使用します。

asort()は、キーと値の対応関係を維持したまま、値を小さい順に並べ替える関数です。

$prices = [
    'apple' => 300,
    'orange' => 200,
    'banana' => 100
];

asort($prices);

print_r($prices);

実行結果は次のようになります。

Array
(
    [banana] => 100
    [orange] => 200
    [apple] => 300
)

値は100200300の昇順になりますが、bananaorangeappleというキーはそれぞれ対応する値と一緒に保持されています。

そのため、連想配列を値で昇順に並べたい場合は、基本的にasort()を使用するとよいでしょう。

値を降順にソートするarsort()

arsort()の基本的な使い方

連想配列の値を大きい順に並べたい場合は、arsort()を使用します。

$prices = [
    'apple' => 300,
    'orange' => 200,
    'banana' => 100
];

arsort($prices);

print_r($prices);

実行結果は次のとおりです。

Array
(
    [apple] => 300
    [orange] => 200
    [banana] => 100
)

arsort()asort()と同様に、キーと値の対応関係を維持します。

価格や売上、スコア、アクセス数などを高い順に表示したい場合に便利です。

キーを昇順にソートするksort()

ksort()の基本的な使い方

値ではなく、連想配列のキーを基準に昇順で並べたい場合はksort()を使用します。

$user = [
    'name' => 'Tanaka',
    'email' => 'tanaka@example.com',
    'age' => 30
];

ksort($user);

print_r($user);

実行結果は次のようになります。

Array
(
    [age] => 30
    [email] => tanaka@example.com
    [name] => Tanaka
)

キーがageemailnameの順に並びます。

設定情報やAPIレスポンスなどをキー順に整理したい場合にも利用できます。

キーを降順にソートするkrsort()

krsort()の基本的な使い方

キーを降順に並べたい場合はkrsort()を使用します。

$user = [
    'name' => 'Tanaka',
    'email' => 'tanaka@example.com',
    'age' => 30
];

krsort($user);

print_r($user);

実行結果は次のようになります。

Array
(
    [name] => Tanaka
    [email] => tanaka@example.com
    [age] => 30
)

ksort()がキーの昇順、krsort()がキーの降順と覚えると分かりやすいでしょう。

sort()とasort()の違い

sort()は既存のキーを維持しない

PHPにはsort()というソート関数もあります。

ただし、連想配列にsort()を使用すると、既存のキーが削除されて新しい数値キーが割り当てられます。

$prices = [
    'apple' => 300,
    'orange' => 200,
    'banana' => 100
];

sort($prices);

print_r($prices);

実行結果は次のようになります。

Array
(
    [0] => 100
    [1] => 200
    [2] => 300
)

appleorangebananaといったキーが失われています。

asort()ならキーを維持できる

同じ配列にasort()を使用すると、キーと値の関係を維持したままソートできます。

asort($prices);

結果は次のようになります。

Array
(
    [banana] => 100
    [orange] => 200
    [apple] => 300
)

そのため、キーに意味がある連想配列を値でソートする場合は、sort()ではなくasort()arsort()を使用するのが基本です。

数値や文字列として明示的にソートする方法

SORT_NUMERICで数値としてソートする

asort()などのソート関数では、第2引数にソート方法を指定できます。

たとえば、文字列として格納されている数値を数値として比較したい場合はSORT_NUMERICを使用します。

$data = [
    'a' => '100',
    'b' => '20',
    'c' => '3'
];

asort($data, SORT_NUMERIC);

print_r($data);

数値として比較されるため、次の順番になります。

3
20
100

データベースやCSVなどから取得した数値が文字列になっている場合に便利です。

SORT_STRINGで文字列としてソートする

文字列として比較したい場合はSORT_STRINGを指定できます。

asort($data, SORT_STRING);

値の型や用途に応じて比較方法を明示しておくと、意図しないソート結果を防ぎやすくなります。

自然な順番でソートする方法

natsort()を使用する

ファイル名や商品番号のような文字列では、通常の文字列比較だと人間の感覚とは異なる順番になることがあります。

たとえば、次のようなデータです。

item1
item10
item2

人間にとっては、

item1
item2
item10

という順番のほうが自然です。

このような場合はnatsort()を使用します。

$items = [
    'a' => 'item10',
    'b' => 'item2',
    'c' => 'item1'
];

natsort($items);

print_r($items);

natsort()はキーと値の関連付けを維持しながら、自然順で並べ替えます。

大文字と小文字を区別せずに自然順でソートしたい場合は、natcasesort()も利用できます。

独自のルールで連想配列をソートする方法

uasort()で値を自由に比較する

単純な昇順や降順ではなく、自分で定義した条件で値を並べたい場合はuasort()を使用できます。

$products = [
    'apple' => 300,
    'orange' => 100,
    'banana' => 200
];

uasort($products, function ($a, $b) {
    return $a <=> $b;
});

print_r($products);

<=>は宇宙船演算子と呼ばれ、2つの値を比較できます。

この場合は値の昇順になるため、次の順番になります。

orange => 100
banana => 200
apple => 300

降順にする場合

降順にしたい場合は、比較する順番を逆にします。

uasort($products, function ($a, $b) {
    return $b <=> $a;
});

すると、次の順番になります。

apple => 300
banana => 200
orange => 100

uasort()はキーとの関連付けを維持するため、連想配列を独自条件でソートするときに便利です。

キーを独自ルールでソートする方法

uksort()を使用する

キーを独自の条件で並べ替えたい場合はuksort()を使用します。

たとえば、キーの文字数が短い順に並べる場合は次のように記述できます。

$data = [
    'bbb' => 1,
    'a' => 2,
    'cc' => 3
];

uksort($data, function ($a, $b) {
    return strlen($a) <=> strlen($b);
});

print_r($data);

結果は次のような順番になります。

a
cc
bbb

uksort()は、キーをユーザー定義の比較関数で並べ替えたい場合に使用します。

多次元の連想配列をソートする方法

usort()で特定の項目を基準にする

実際のWebアプリケーションでは、次のような多次元配列を扱うことも多くあります。

$users = [
    [
        'name' => 'Tanaka',
        'age' => 35
    ],
    [
        'name' => 'Suzuki',
        'age' => 25
    ],
    [
        'name' => 'Sato',
        'age' => 30
    ]
];

この配列をageの小さい順に並べる場合は、usort()を使用できます。

usort($users, function ($a, $b) {
    return $a['age'] <=> $b['age'];
});

結果は次のような順番になります。

Suzuki 25
Sato   30
Tanaka 35

ただし、usort()は既存のキーを維持しません。

元のキーを残したままユーザー定義の条件で値をソートしたい場合は、uasort()を使用します。

array_multisort()で多次元配列をソートする方法

複数条件のソートにも利用できる

多次元配列ではarray_multisort()を使用する方法もあります。

たとえば、年齢を基準に昇順で並べる場合は次のように記述できます。

$users = [
    ['name' => 'Tanaka', 'age' => 35],
    ['name' => 'Suzuki', 'age' => 25],
    ['name' => 'Sato', 'age' => 30]
];

$ages = array_column($users, 'age');

array_multisort($ages, SORT_ASC, SORT_NUMERIC, $users);

array_multisort()は、複数の配列をまとめて並べ替えたり、複数条件で多次元配列をソートしたりする場合に利用できます。

ただし、キーの扱いがasort()uasort()とは異なるため、連想キーを保持する必要がある場合は注意が必要です。

PHPのソート関数は元の配列を変更する

ソート済みの新しい配列が返されるわけではない

PHPの主要な配列ソート関数は、対象となる配列そのものを変更します。

そのため、次のように書いても、$sortedにソート済み配列が格納されるわけではありません。

$sorted = asort($prices);

ソート後の配列を利用するときは、次のようにします。

asort($prices);

print_r($prices);

なお、現在のPHPではasort()などのソート関数は成功時にtrueを返しますが、ソート済み配列そのものを戻り値として返すわけではありません。

元の配列を残したい場合

ソート前の配列も残しておきたい場合は、別の変数にコピーしてからソートします。

$sortedPrices = $prices;

asort($sortedPrices);

これなら、$pricesには元の順番が残り、$sortedPricesだけがソートされます。

PHP 8.0以降では同じ値の順序が保持される

安定ソートになっている

PHP 8.0.0以降では、比較した2つの要素が同じ値だと判定された場合、元の配列での相対的な順序が保持されます。

たとえば、同じスコアを持つ複数のデータをソートした場合でも、PHP 8.0以降では元の並び順が維持されます。

PHP 8.0.0より前では、値が等しい要素同士の順番は未定義でした。

PHPのバージョンによって挙動が異なる可能性があるため、古いPHP環境を扱う場合は注意が必要です。

PHPで連想配列をソートするときの注意点

キーを維持する必要があるか確認する

連想配列をソートするときは、最初にキーを残す必要があるか確認しましょう。

キーに意味がある場合は、sort()rsort()を使用すると既存のキーが失われます。

そのため、連想配列では主に次の関数を使用します。

asort()
arsort()
ksort()
krsort()
uasort()
uksort()

キーを維持する必要があるかどうかによって、適切な関数を選ぶことが重要です。

データ型に合わせてソート方法を指定する

数値のように見える文字列を扱う場合などは、比較方法によって並び順が変わる可能性があります。

数値として並べたい場合は、次のようにSORT_NUMERICを指定すると意図が明確になります。

asort($array, SORT_NUMERIC);

文字列として並べる場合は、

asort($array, SORT_STRING);

と指定できます。

特にデータベースや外部ファイルから取得したデータでは型が想定と異なる場合があるため、比較方法を明示しておくと安全です。

PHPの連想配列をソートする方法のまとめ

PHPで連想配列をソートするときは、何を基準に並べるかによって関数を使い分けます。

値を昇順に並べる場合は、

asort($array);

値を降順に並べる場合は、

arsort($array);

キーを昇順に並べる場合は、

ksort($array);

キーを降順に並べる場合は、

krsort($array);

を使用します。

さらに、独自条件で値をソートする場合はuasort()、独自条件でキーをソートする場合はuksort()が利用できます。

多次元配列ではusort()array_multisort()も便利です。

PHPの連想配列をソートするときに特に重要なのは、ソート後もキーと値の対応関係を維持する必要があるかどうかです。

キーに意味がある連想配列では、既存キーを削除するsort()を安易に使用せず、asort()arsort()など目的に合ったソート関数を選びましょう。

以上、PHPで連想配列をソートする方法についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次