Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】usort()関数の使い方

usort関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

usort関数は、配列をユーザー定義の比較関数に基づいてソートする関数です。この関数は、配列の要素を、利用者が定義した比較ロジックに従って並べ替えます。ソートのロジックは、開発者が作成する比較関数によって決定されます。この比較関数は、ソート対象の2つの要素を引数として受け取り、それらの要素の相対的な順序を示す整数値を返さなければなりません。具体的には、最初の要素が2番目の要素よりも小さい場合は負の値を、両者が等しい場合は0を、そして最初の要素が大きい場合は正の値を返します。これにより、単純な数値や文字列のソートだけでなく、オブジェクトの特定のプロパティ値や、複数の条件を組み合わせた複雑なルールに基づいたカスタムソートを実現できます。usort関数は、元の配列の内容を直接変更(インプレースソート)し、ソート後の配列のキーはゼロから始まる連続した数値に再割り当てされます。したがって、元のキーと値の関連性を維持したい場合には適していません。ソート処理が成功した場合はtrueを、何らかの問題が発生して失敗した場合はfalseを返します。オブジェクトのコレクションを、特定のプロパティの昇順または降順で並べ替えたい場合などに特に役立ちます。

構文(syntax)

1<?php
2$arrayToSort = [3, 1, 4, 1, 5, 9, 2, 6];
3
4usort($arrayToSort, fn($a, $b) => $a <=> $b);
5?>

引数(parameters)

array &$array, callable $callback

  • array &$array: ソート対象となる配列。この配列は参照渡しされるため、関数内で直接変更されます。
  • callable $callback: 配列の要素を比較するためのコールバック関数。2つの引数を取り、それらを比較した結果を整数で返します。

戻り値(return)

bool

usort 関数は、配列の要素をユーザー定義の比較関数を用いてソートします。ソートが成功した場合は TRUE を、失敗した場合は FALSE を返します。

サンプルコード

PHP usortで連想配列をソートする

1<?php
2
3/**
4 * usort関数の使用例を示すスクリプト。
5 * ユーザー定義の比較関数を用いて配列をソートします。
6 */
7
8// ソート対象となる連想配列のリストを定義します。
9// 各要素はユーザーのID、名前、年齢を表します。
10$users = [
11    ['id' => 1, 'name' => 'Alice', 'age' => 30],
12    ['id' => 2, 'name' => 'Bob', 'age' => 25],
13    ['id' => 3, 'name' => 'Charlie', 'age' => 35],
14    ['id' => 4, 'name' => 'David', 'age' => 25], // 同年齢のユーザーで動作確認
15];
16
17echo "--- ソート前の配列 ---\n";
18print_r($users);
19
20// usort関数を使用して、$users配列を'age'(年齢)の昇順でソートします。
21// 第二引数には、2つの要素を比較するロジックを定義したクロージャ(無名関数)を渡します。
22usort($users, function ($userA, $userB) {
23    // 宇宙船演算子 (<=>) は、左辺が右辺より小さい場合に -1、
24    // 等しい場合に 0、大きい場合に 1 を返します。
25    // これにより、'age'キーの値に基づいて昇順ソートが簡潔に実装できます。
26    return $userA['age'] <=> $userB['age'];
27});
28
29echo "\n--- 'age'で昇順ソート後の配列 ---\n";
30print_r($users);
31
32?>

PHPのusort関数は、配列の要素をユーザーが定義した比較ルールに基づいてソートするために使用されます。この関数は、通常のソート関数では対応できない複雑な条件や、連想配列の特定のキーによるソートを行う際に特に役立ちます。

第一引数にはソート対象の配列を参照渡しで指定します。そのため、関数が実行されると元の配列そのものがソートされた状態に更新されます。第二引数には、配列内の2つの要素を比較するロジックを定義したcallable(コールバック関数、例として無名関数やクロージャ)を渡します。このコールバック関数は、比較対象の2つの要素を引数として受け取り、それらの大小関係を示す整数(-1: 第一引数が小さい, 0: 等しい, 1: 第一引数が大きい)を返さなければなりません。usort関数はこの戻り値を利用してソート順を決定します。

関数の戻り値はbool型で、ソートが成功した場合はtrue、失敗した場合はfalseを返します。

提供されたサンプルコードでは、ユーザーの情報を格納した連想配列$usersを、各ユーザーのage(年齢)に基づいて昇順にソートしています。比較関数としてクロージャを使用し、PHP 7で導入された宇宙船演算子<=>を用いることで、2つの年齢の大小関係を簡潔にusort関数に伝えています。これにより、ソート前の配列は年齢順に並び替えられて出力されます。

usort関数は、引数で渡された配列そのものを直接変更しますので、元の配列を保持したい場合は事前にコピーしてください。比較関数は、最初の引数が2番目の引数より小さい場合に負の値、等しい場合に0、大きい場合に正の値を返す必要があります。サンプルコードで使われている宇宙船演算子 (<=>) は、このルールを簡潔に実現できますが、PHP 7.0以降の機能です。PHP 6以前の環境では動作しないため、if-else文などで比較ロジックを記述してください。また、usortは安定ソートではないため、比較結果が同じ要素同士(例:年齢が同じユーザー)の相対的な順序は保証されない点に留意してください。比較対象のキーが存在しない場合にエラーにならないよう、比較関数内でキーの存在確認を行うと、より堅牢なコードになります。

PHP usortで複数フィールドをソートする

1<?php
2
3/**
4 * 複数のフィールドに基づいて配列をソートするサンプルコード。
5 * usort 関数は、ユーザー定義の比較関数を使用して配列をソートします。
6 * この例では、まず 'name' フィールドで昇順にソートし、
7 * 'name' が同じ場合は 'age' フィールドで昇順にソートします。
8 */
9
10// ソート対象のデータ配列を定義
11$users = [
12    ['name' => 'Alice', 'age' => 30, 'city' => 'New York'],
13    ['name' => 'Bob', 'age' => 25, 'city' => 'London'],
14    ['name' => 'Charlie', 'age' => 35, 'city' => 'Paris'],
15    ['name' => 'Alice', 'age' => 28, 'city' => 'Tokyo'], // Aliceの異なる年齢
16    ['name' => 'Bob', 'age' => 30, 'city' => 'Rome'],    // Bobの異なる年齢
17];
18
19echo "--- ソート前の配列 ---" . PHP_EOL;
20print_r($users);
21
22// usort を使用して、カスタム比較関数で配列をソート
23// 比較関数は2つの要素 ($a, $b) を受け取り、以下を返します。
24//   - $a が $b より小さい場合: 負の整数
25//   - $a と $b が等しい場合: 0
26//   - $a が $b より大きい場合: 正の整数
27// PHP 7 以降では、<=> (spaceship operator) を使用すると簡潔に記述できます。
28$sortedSuccessfully = usort($users, function ($a, $b) {
29    // 最初に 'name' フィールドで比較します (昇順)
30    $nameComparison = $a['name'] <=> $b['name'];
31
32    // 'name' が異なる場合はその結果を返します
33    if ($nameComparison !== 0) {
34        return $nameComparison;
35    }
36
37    // 'name' が同じ場合は 'age' フィールドで比較します (昇順)
38    return $a['age'] <=> $b['age'];
39});
40
41if ($sortedSuccessfully) {
42    echo PHP_EOL . "--- ソート後の配列 (name -> age) ---" . PHP_EOL;
43    print_r($users);
44} else {
45    echo PHP_EOL . "配列のソートに失敗しました。" . PHP_EOL;
46}

PHPのusort関数は、配列をユーザーが定義した独自の比較ルールに基づいてソートするための機能です。

第一引数&$arrayにはソートしたい配列を渡します。この引数は参照渡しであるため、usort関数が実行されると、元の配列そのものがソートされた状態に変更されます。

第二引数$callbackには、ソート対象となる2つの要素を受け取り、それらの比較結果を整数値で返す関数を指定します。この比較関数は、最初の要素が2番目の要素より小さい場合は負の整数、等しい場合は0、大きい場合は正の整数を返さなければなりません。PHP 7以降では、<=> (spaceship operator) を使用すると、この比較ロジックを簡潔に記述できます。

このサンプルコードでは、ユーザーのデータ配列を、まずnameフィールドの昇順で比較し、もしnameが同じだった場合にはageフィールドの昇順で比較するという、複数条件でのソートを実現しています。これにより、同じ名前のユーザーがいる場合でも、年齢順に並べ替えることが可能です。

usort関数の戻り値はbool型で、ソート処理が成功した場合はtrueを、失敗した場合はfalseを返します。これにより、ソートが正しく行われたかどうかをプログラムで確認できます。

usort関数は元の配列を直接変更しますので、元の配列を保持したい場合は、ソート前に配列を複製してください。比較関数は、2つの要素を受け取り、それぞれ負、0、正の値を正確に返す必要があります。このルールを誤るとソート結果が不正になるため注意が必要です。PHP 7以降では、<=> (spaceship operator) を利用すると比較処理を簡潔に記述できます。関数は成功/失敗をブール値で返すため、ソートが正しく行われたか確認することをおすすめします。複数のキーでソートする際は、サンプルコードのように主となるキーで比較し、等しい場合に次のキーで比較するロジックで実装します。

PHP usortで配列をカスタムソートする

1<?php
2
3/**
4 * usort 関数を使ったカスタムソートのサンプルコードです。
5 * このコードは、連想配列の配列を特定のキー(ここでは 'age')に基づいてソートする方法を示します。
6 */
7
8// ソート対象となる連想配列の配列を準備します。
9$users = [
10    ['name' => 'Alice', 'age' => 30],
11    ['name' => 'Bob', 'age' => 25],
12    ['name' => 'Charlie', 'age' => 35],
13    ['name' => 'David', 'age' => 25], // 同年齢のユーザーを含める
14];
15
16echo "--- ソート前 ---" . PHP_EOL;
17print_r($users);
18
19// usort を使用して、$users 配列を 'age' キーに基づいて昇順でソートします。
20// 2番目の引数には、比較ロジックを定義するコールバック関数(クロージャ)を渡します。
21// コールバック関数は2つの要素 ($a, $b) を受け取り、以下を返します。
22//   - $a が $b より小さい場合: 負の値
23//   - $a が $b と等しい場合: 0
24//   - $a が $b より大きい場合: 正の値
25// PHP 7 以降では、<=> (spaceship operator) を使うと簡潔に記述できます。
26usort($users, function (array $a, array $b): int {
27    // 年齢で比較し、昇順にソートします。
28    // 同じ年齢の場合、元の順序が維持されるわけではない点に注意してください。
29    return $a['age'] <=> $b['age'];
30});
31
32echo "--- 年齢で昇順ソート後 ---" . PHP_EOL;
33print_r($users);
34
35// 別の例として、名前でアルファベット順(昇順)にソートする場合
36// usort($users, function (array $a, array $b): int {
37//     return $a['name'] <=> $b['name'];
38// });
39
40// echo "--- 名前で昇順ソート後 ---" . PHP_EOL;
41// print_r($users);

PHPのusort関数は、ユーザーが定義したカスタムな比較ルールに基づいて配列をソートするための関数です。通常のソート関数では対応できない、連想配列の特定のキーの値やオブジェクトのプロパティなど、複雑な条件でソートを行いたい場合に特に有効です。

この関数には二つの引数を渡します。最初の引数&$arrayはソート対象となる配列です。この引数は参照渡しされるため、usort関数を実行すると、元の配列そのものがソートされた状態で変更されます。二番目の引数$callbackには、配列内の二つの要素を比較し、その順序を決定するための関数(コールバック関数)を指定します。このコールバック関数は二つの要素を受け取り、最初の要素が二番目の要素より「小さい」と判断される場合は負の値を、「等しい」場合は0を、「大きい」と判断される場合は正の値を返します。

サンプルコードでは、ユーザー情報の連想配列を'age'キーの値に基づいて昇順にソートしています。コールバック関数内で$a['age'] <=> $b['age']と記述することで、PHP 7以降で利用可能な比較演算子(spaceship operator)を使って、この比較ロジックを簡潔に表現しています。usort関数は、ソート処理が成功した場合はtrueを、失敗した場合はfalseをブール値として返します。これにより、開発者は柔軟かつ強力なソート処理を実装することができます。

usort関数は、引数で渡された配列そのものを直接変更します。そのため、ソート前の元の配列を保持したい場合は、事前にコピーを作成してください。

コールバック関数は、比較対象の2つの要素を受け取り、一つ目が二つ目より小さい場合は負、等しい場合はゼロ、大きい場合は正の整数を返す必要があります。PHP 7以降の<=>(宇宙船演算子)を使うと、この比較ロジックを簡潔に記述できます。

特に重要な注意点として、usortは同等の値を持つ要素の元の順序を保証しません。これは「安定ソート」ではないため、同じ値の要素の相対的な順序はソート後に変わる可能性があります。コールバック内で配列キーにアクセスする際は、キーが存在しない場合にエラーにならないよう、isset()などで確認することを推奨します。また、引数に型ヒントを指定することで、コードの堅牢性が向上します。

PHP usortで配列を降順ソートする

1<?php
2
3/**
4 * usort 関数を使用して配列を降順にソートする例
5 */
6function exampleUsortDescending(): void
7{
8    // ソート対象の配列を定義
9    $numbers = [3, 1, 4, 1, 5, 9, 2, 6];
10
11    echo "ソート前の配列: ";
12    print_r($numbers);
13
14    // usort 関数を使用して配列を降順にソート
15    // 比較コールバック関数:
16    //   - $a が $b より小さい場合($b - $a が正の場合)は、$a を $b の後に配置 (降順)
17    //   - $a が $b より大きい場合($b - $a が負の場合)は、$a を $b の前に配置 (降順)
18    //   - $a と $b が同じ場合($b - $a が 0 の場合)は、位置を変更しない
19    usort($numbers, function (int $a, int $b): int {
20        return $b - $a; // 降順ソート
21    });
22
23    echo "ソート後の配列 (降順): ";
24    print_r($numbers);
25}
26
27// 関数の実行
28exampleUsortDescending();
29

PHPの usort 関数は、ユーザーが独自に定義した比較ルールに基づいて、配列の要素を並べ替えるための関数です。

この関数は主に2つの引数を取ります。第1引数の &$array には、ソートしたい配列を指定します。この引数は参照渡しであるため、関数を実行すると元の配列そのものが直接変更されます。第2引数の $callback には、要素を比較するためのルールを記述した関数(コールバック関数)を指定します。usort 関数自体の戻り値は bool 型で、ソートが成功した場合は true を、失敗した場合は false を返します。

サンプルコードでは、数値の配列を降順(大きい順)にソートしています。その比較ルールは、第2引数に指定されたコールバック関数 function (int $a, int $b): int { return $b - $a; } で定義されています。この関数は、配列の中から2つの要素 $a$b を受け取り、その差を返します。$b - $a の計算結果が正の値になる場合、$a$b よりも後ろに配置されます。このロジックにより、値が大きい要素ほど配列の前方に移動するため、結果として配列全体が降順に並べ替えられます。このように usort を使うことで、単純な昇順・降順だけでなく、複雑な条件でのソートも柔軟に実装できます。

比較関数の戻り値は、負の値で第一引数を第二引数の前に、正の値で後に配置するというルールを理解することが重要です。このサンプルコードでは$b - $aとすることで降順ソートを実現しています。usort関数は元の配列を直接変更しますので、ソート後に新しい配列が生成されるわけではない点にご注意ください。PHP 7.0以降、比較関数は整数を返す必要があります。この関数はソートの成否を真偽値で返しますので、予期せぬエラーに備え戻り値を確認するとより堅牢なコードになります。また、等しい要素の相対的な順序は保持されない場合がありますのでご留意ください。

関連コンテンツ

関連プログラミング言語