PHP 連想配列のソート:asort, ksort, usort

連想配列をソートする場合、キーを保持するかどうか、何を基準にソートするかで使う関数が変わります。PHP には用途に応じた複数のソート関数が用意されています。

関数ソート基準キーの保持順序
asort保持する昇順
arsort保持する降順
ksortキー保持する昇順
krsortキー保持する降順
usort値(カスタム)再インデックス任意
uasort値(カスタム)保持する任意

値でソート(asort / arsort)

asort() は値で昇順ソートし、キーと値の対応を維持します。

$prices = ['apple' => 150, 'banana' => 80, 'orange' => 120];

asort($prices);
print_r($prices);
// ['banana' => 80, 'orange' => 120, 'apple' => 150]

arsort($prices);
print_r($prices);
// ['apple' => 150, 'orange' => 120, 'banana' => 80]

キーでソート(ksort / krsort)

ksort() はキーでアルファベット順にソートします。

$user = ['name' => 'Alice', 'age' => 25, 'email' => 'alice@example.com'];

ksort($user);
print_r($user);
// ['age' => 25, 'email' => 'alice@example.com', 'name' => 'Alice']

カスタムソート(usort / uasort)

比較関数を自分で定義したい場合は usort() または uasort() を使います。比較関数は 2 つの要素を受け取り、負・0・正の値を返します。

$users = [
    ['name' => 'Charlie', 'age' => 35],
    ['name' => 'Alice', 'age' => 25],
    ['name' => 'Bob', 'age' => 30]
];

// 年齢で昇順ソート
usort($users, function ($a, $b) {
    return $a['age'] - $b['age'];
});

// または宇宙船演算子を使う
usort($users, fn($a, $b) => $a['age'] <=> $b['age']);

print_r($users);
// [Alice(25), Bob(30), Charlie(35)]

宇宙船演算子 <=> は PHP 7 で導入され、比較関数を簡潔に書けます。左辺が小さければ負、等しければ 0、大きければ正を返します。

複数条件でソート

複数の条件でソートする場合は、比較関数内で条件を連鎖させます。

$users = [
    ['name' => 'Alice', 'age' => 25],
    ['name' => 'Bob', 'age' => 25],
    ['name' => 'Charlie', 'age' => 30]
];

// 年齢で昇順、同じなら名前で昇順
usort($users, function ($a, $b) {
    return $a['age'] <=> $b['age']
        ?: $a['name'] <=> $b['name'];
});

?: は左辺が 0(等しい)の場合に右辺を評価する記法です。これにより「第 1 条件が等しければ第 2 条件で比較」という処理が 1 行で書けます。