PHPで連想配列を扱っていると、値の中身で並び替えたいというケースがよくあります。特にデータベースやAPIから取得した配列を表示順に整える際に、usort()
と独自の比較関数が役立ちます。
本記事では、連想配列を値の大小や文字列順で並べる方法を、実用例とともにわかりやすく解説します。
usort()で連想配列を並び替えるとは?
usort()
は、ユーザー定義の比較関数を使って配列の要素を並べ替える関数です。数値や文字列、日付など、並び順を自由に制御できるのが最大の特徴です。
ただし、連想配列に対して使う場合は注意が必要です。usort()
はキーを保持せず、インデックスが再構成される点を理解しておきましょう。
数値で昇順に並び替える例
以下は、score
キーの値を基準に昇順で並び替えるサンプルです。
<?php
$data = [
['name' => 'Alice', 'score' => 85],
['name' => 'Bob', 'score' => 70],
['name' => 'Carol', 'score' => 92],
];
usort($data, function ($a, $b) {
return $a['score'] <=> $b['score'];
});
print_r($data);
?>
出力結果(昇順):
Array
(
[0] => Array ( [name] => Bob [score] => 70 )
[1] => Array ( [name] => Alice [score] => 85 )
[2] => Array ( [name] => Carol [score] => 92 )
)
ここで使われている<=>
は「宇宙船演算子」と呼ばれるもので、PHP 7.0以降で使用可能です。$a <=> $b
は比較結果として -1(小さい)、0(等しい)、1(大きい)を返します。
降順に並べたい場合
降順に並び替えるには、比較の向きを反転するだけです。
usort($data, function ($a, $b) {
return $b['score'] <=> $a['score'];
});
このようにすれば、score
の高い順に並び替えられます。
文字列順(名前のアルファベット順)で並べる
文字列を並べる場合はstrcmp()
を使うと便利です。
usort($data, function ($a, $b) {
return strcmp($a['name'], $b['name']);
});
アルファベット順(A → Z)に整列されます。降順にしたい場合は順番を逆にします:
usort($data, function ($a, $b) {
return strcmp($b['name'], $a['name']);
});
日付で並べる場合
例えばdate
キーにY-m-d
形式の文字列がある場合、strtotime()
を使って比較可能です。
$data = [
['title' => 'Article A', 'date' => '2024-05-01'],
['title' => 'Article B', 'date' => '2024-04-25'],
['title' => 'Article C', 'date' => '2024-05-10'],
];
usort($data, function ($a, $b) {
return strtotime($a['date']) <=> strtotime($b['date']);
});
このコードでは、古い日付から新しい日付へ昇順で並び替えられます。
キーを保持したまま並び替えたいときは?
usort()
では連想配列のキーが保持されません。キーも保持しておきたい場合は、uasort()
を使いましょう。
uasort($data, function ($a, $b) {
return $a['score'] <=> $b['score'];
});
uasort()
は連想配列のキーを保持したまま並び替えます。
まとめ
PHPで連想配列を値で並び替えるには、usort()
やuasort()
と比較関数の組み合わせが基本です。値の型(数値・文字列・日付)に応じて適切な比較ロジックを使うことで、柔軟な並び替えが実現できます。
- 数値:
<=>
(宇宙船演算子) - 文字列:
strcmp()
- 日付:
strtotime()
で変換して比較 - キーを保持したいとき:
uasort()
連想配列の整列は実務でも頻繁に使われるテクニックなので、ぜひマスターしておきましょう。