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

作成日: 更新日:

uksort関数は、PHPにおいて、配列のキーをユーザー定義の比較関数に基づいてソートするために使用される関数です。この関数は、配列の要素の値ではなく、そのキー(添字)の順序を、開発者が指定するロジックに従ってカスタマイズしたい場合に非常に役立ちます。

具体的には、uksort関数は二つの引数を取ります。一つ目はソート対象となる配列で、これは参照渡しで渡されるため、元の配列が直接変更されます。二つ目は比較を行うためのコールバック関数(ユーザー定義関数)です。このコールバック関数は二つのキーを受け取り、それらのキーの相対的な順序を示す整数値を返さなければなりません。例えば、最初のキーが二番目のキーより小さい場合は負の数、等しい場合はゼロ、大きい場合は正の数を返します。

通常のソート関数では対応できないような、特定のビジネスロジックに基づいた複雑なキーの並べ替えが必要な場面で、uksort関数はその柔軟性から重宝されます。たとえば、キーが単なる文字列ではなく、特定の規則に従って生成されたIDである場合や、複数の要素から構成される複合的なキーを持つ場合などに、独自の比較ロジックを適用できます。

ソートが成功した場合はtrueを、失敗した場合はfalseを返します。この関数を使うことで、開発者は配列のキーに対して、自由度の高い順序付けロジックを適用し、データの管理をより効率的に行えるようになります。

基本的な使い方

構文(syntax)

<?php
// 連想配列のキーをカスタム比較関数でソートする
$data = [
    "banana" => 1,
    "apple" => 2,
    "orange" => 3,
];

// キーをアルファベット順(昇順)にソートする例
uksort($data, function ($keyA, $keyB) {
    return strcmp($keyA, $keyB);
});
?>

引数(parameters)

array &$array, callable $callback

PHP:

  • array &$array: ソート対象の連想配列。この配列は参照渡しされ、関数内で直接変更されます。
  • callable $callback: 各要素のキーを比較するために使用されるコールバック関数。この関数は2つの引数(配列のキー)を取り、整数を返します。返り値は、最初の引数が2番目の引数より小さい場合は-1、等しい場合は0、大きい場合は1である必要があります。

戻り値(return)

bool

配列のキーを逆順にソートできた場合は TRUE を、それ以外の場合は FALSE を返します。

サンプルコード

php uksortでキーをカスタムソートする

<?php

/**
 * uksort() の使用例を示します。
 * ユーザー定義の比較関数を使用して、配列のキーでソートします。
 */
function demonstrateUksort(): void
{
    // ソートする連想配列を定義します。
    // キーはフルーツの名前、値は色です。
    $fruits = [
        "banana" => "yellow",
        "apple" => "red",
        "kiwi" => "green",
        "orange" => "orange",
        "grape" => "purple",
        "pear" => "green",
    ];

    echo "--- ソート前の配列 ---\n";
    print_r($fruits);

    // キーの長さを基準に比較するコールバック関数を定義します。
    // uksort() に渡されるこの関数は、2つのキーを受け取り、それらの順序を決定するために整数を返します。
    // - 0 を返すと、2つのキーは等しいとみなされます。
    // - 0 未満の値を返すと、$keyA は $keyB の前に来ます。
    // - 0 より大きい値を返すと、$keyA は $keyB の後に来ます。
    $compareKeysByLength = function (string $keyA, string $keyB): int {
        $lenA = strlen($keyA);
        $lenB = strlen($keyB);

        // キーの長さで比較します。
        // 同じ長さの場合は、文字列としてアルファベット順に比較します。
        if ($lenA === $lenB) {
            return $keyA <=> $keyB; // PHP 7以降の「宇宙船演算子」を使用して、コンパクトに比較
        }

        return $lenA <=> $lenB; // 長さで比較
    };

    // uksort() 関数を呼び出して、定義したコールバック関数で配列のキーをソートします。
    // uksort() は配列自体を変更し、成功した場合は true、失敗した場合は false を返します。
    $isSorted = uksort($fruits, $compareKeysByLength);

    echo "\n--- ソート後の配列 (キーの長さで昇順、同じ長さならアルファベット順) ---\n";
    if ($isSorted) {
        print_r($fruits);
    } else {
        echo "配列のソートに失敗しました。\n";
    }

    // 別の比較関数でのソート例:キーを逆順(降順)でソート
    $compareKeysReverseAlphabetical = function (string $keyA, string $keyB): int {
        // デフォルトの文字列比較の逆順で比較します。
        return $keyB <=> $keyA;
    };

    // 配列を元の状態に戻してから、再度ソートします。
    $fruits = [
        "banana" => "yellow",
        "apple" => "red",
        "kiwi" => "green",
        "orange" => "orange",
        "grape" => "purple",
        "pear" => "green",
    ];

    $isSortedReverse = uksort($fruits, $compareKeysReverseAlphabetical);

    echo "\n--- ソート後の配列 (キーをアルファベット逆順) ---\n";
    if ($isSortedReverse) {
        print_r($fruits);
    } else {
        echo "配列のソートに失敗しました。\n";
    }
}

// 関数の実行
demonstrateUksort();

?>

PHPのuksort関数は、ユーザーが定義した比較関数を使用して、配列のキーを基準にソートを行う機能を提供します。

この関数は最初の引数として、ソート対象となる連想配列を参照渡しで受け取ります。そのため、関数が実行されると元の配列自体が直接変更されます。2番目の引数には、キーの順序を決定するための比較ロジックを実装したコールバック関数を指定します。このコールバック関数は2つのキーを受け取り、それらの相対的な順序を示す整数を返します。具体的には、最初のキーが2番目のキーより小さい場合は負の数、等しい場合は0、大きい場合は正の数を返さなければなりません。

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

提供されたサンプルコードでは、まずフルーツの連想配列を定義し、キーの長さを基準にソートする例を示しています。同じ長さのキーの場合はアルファベット順に比較するロジックがコールバック関数内に記述されています。次に、元の配列をリセットした後、キーをアルファベット逆順でソートする別の例も示しており、コールバック関数を切り替えることで多様なソート条件に対応できることがわかります。このようにuksortを用いることで、標準のソート関数では実現できない複雑な条件でキーを並べ替えることが可能になります。

uksortは引数で渡された配列そのものを変更する「参照渡し」の関数です。元の配列の状態を保ちたい場合は、関数を呼び出す前に配列をコピーしてください。比較関数は、2つのキーを受け取り、それらの順序を示す整数(負、ゼロ、正)を正確に返す必要があります。この戻り値のルールを間違えると、意図しないソート順になるため注意が必要です。また、uksortはソートの成否を真偽値で返すため、処理後に必ずその戻り値を確認し、適切にエラーハンドリングを行うことを推奨します。

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