【PHP】連想配列の値で並び替える方法|usortとカスタム比較関数の使い方

【PHP】連想配列の値で並び替える方法|usortとカスタム比較関数の使い方 PHP

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()

連想配列の整列は実務でも頻繁に使われるテクニックなので、ぜひマスターしておきましょう。