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

作成日: 更新日:

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

基本的な使い方

構文(syntax)

<?php
$arrayToSort = [3, 1, 4, 1, 5, 9, 2, 6];

usort($arrayToSort, fn($a, $b) => $a <=> $b);
?>

引数(parameters)

array &$array, callable $callback

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

戻り値(return)

bool

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

サンプルコード

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

<?php

/**
 * usort 関数を使ったカスタムソートのサンプルコードです。
 * このコードは、連想配列の配列を特定のキー(ここでは 'age')に基づいてソートする方法を示します。
 */

// ソート対象となる連想配列の配列を準備します。
$users = [
    ['name' => 'Alice', 'age' => 30],
    ['name' => 'Bob', 'age' => 25],
    ['name' => 'Charlie', 'age' => 35],
    ['name' => 'David', 'age' => 25], // 同年齢のユーザーを含める
];

echo "--- ソート前 ---" . PHP_EOL;
print_r($users);

// usort を使用して、$users 配列を 'age' キーに基づいて昇順でソートします。
// 2番目の引数には、比較ロジックを定義するコールバック関数(クロージャ)を渡します。
// コールバック関数は2つの要素 ($a, $b) を受け取り、以下を返します。
//   - $a が $b より小さい場合: 負の値
//   - $a が $b と等しい場合: 0
//   - $a が $b より大きい場合: 正の値
// PHP 7 以降では、<=> (spaceship operator) を使うと簡潔に記述できます。
usort($users, function (array $a, array $b): int {
    // 年齢で比較し、昇順にソートします。
    // 同じ年齢の場合、元の順序が維持されるわけではない点に注意してください。
    return $a['age'] <=> $b['age'];
});

echo "--- 年齢で昇順ソート後 ---" . PHP_EOL;
print_r($users);

// 別の例として、名前でアルファベット順(昇順)にソートする場合
// usort($users, function (array $a, array $b): int {
//     return $a['name'] <=> $b['name'];
// });

// echo "--- 名前で昇順ソート後 ---" . PHP_EOL;
// 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で配列を降順ソートする

<?php

/**
 * usort 関数を使用して配列を降順にソートする例
 */
function exampleUsortDescending(): void
{
    // ソート対象の配列を定義
    $numbers = [3, 1, 4, 1, 5, 9, 2, 6];

    echo "ソート前の配列: ";
    print_r($numbers);

    // usort 関数を使用して配列を降順にソート
    // 比較コールバック関数:
    //   - $a が $b より小さい場合($b - $a が正の場合)は、$a を $b の後に配置 (降順)
    //   - $a が $b より大きい場合($b - $a が負の場合)は、$a を $b の前に配置 (降順)
    //   - $a と $b が同じ場合($b - $a が 0 の場合)は、位置を変更しない
    usort($numbers, function (int $a, int $b): int {
        return $b - $a; // 降順ソート
    });

    echo "ソート後の配列 (降順): ";
    print_r($numbers);
}

// 関数の実行
exampleUsortDescending();

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以降、比較関数は整数を返す必要があります。この関数はソートの成否を真偽値で返しますので、予期せぬエラーに備え戻り値を確認するとより堅牢なコードになります。また、等しい要素の相対的な順序は保持されない場合がありますのでご留意ください。

【PHP8.x】usort関数の使い方 | いっしー@Webエンジニア