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 行で書けます。