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

作成日: 更新日:

uasort関数は、ユーザー定義の比較関数を使用して配列をソートする関数です。この関数は、配列の要素の値に基づいて並べ替える際に、各要素のインデックス(キー)と値の関連付けを維持するという特徴があります。特に、連想配列のようにキーと値のペアが重要な意味を持つ場合に非常に役立ちます。

uasort関数を使用するには、ソートしたい配列と、比較ロジックを記述したコールバック関数(比較関数)を引数として渡します。この比較関数は、ソート対象の配列から2つの要素を受け取り、それらを比較して順序を決定するための整数値を返します。具体的には、最初の要素が2番目の要素より小さい場合は負の数、等しい場合は0、大きい場合は正の数を返すように実装します。

この関数を実行すると、元の配列が比較関数のルールに従って並べ替えられます。ソートが成功した場合はtrue、失敗した場合はfalseが戻り値として返されます。例えば、商品リストを価格順や名前順に並べ替えたいが、商品のID(キー)と情報(値)の関連は崩したくない、といったシナリオでこのuasort関数を活用することができます。

基本的な使い方

構文(syntax)

<?php
$array = ['banana' => 3, 'apple' => 1, 'cherry' => 2];

uasort($array, function ($a, $b) {
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
});
?>

引数(parameters)

array &$array, callable $callback

  • array &$array: ソート対象の連想配列。参照渡しで渡されるため、関数内で変更されると元の配列も変更されます。
  • callable $callback: 配列の各要素を比較するために使用されるコールバック関数。2つの引数(配列の要素)を受け取り、それらを比較した結果を返します。

戻り値(return)

bool

uasort関数は、指定された連想配列の要素を、キーと値のペアを保持したまま、ユーザー定義の比較関数に基づいてソートします。ソートが成功した場合は TRUE を、失敗した場合は FALSE を返します。

サンプルコード

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

<?php

/**
 * uasort関数を使用して、連想配列を値でソートする例です。
 * インデックスと値の関連付けは維持されます。
 */
function demonstrateUasort(): void
{
    // ソートする連想配列を定義
    $fruits = [
        'apple' => 3,
        'banana' => 1,
        'cherry' => 2,
        'date' => 4,
    ];

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

    // uasort関数を使用して、配列を値で昇順にソート
    // コールバック関数は、2つの要素を比較し、
    // $a < $b の場合は負の値、
    // $a == $b の場合は 0、
    // $a > $b の場合は正の値を返します。
    $success = uasort($fruits, function (int $a, int $b): int {
        return $a <=> $b; // PHP 7以降で利用可能な比較演算子 (spaceship operator)
    });

    if ($success) {
        echo "\n--- ソート後の配列 (値で昇順) ---\n";
        print_r($fruits);
    } else {
        echo "\n配列のソートに失敗しました。\n";
    }

    // 別な例:値で降順にソート
    $temperatures = [
        'monday' => 25,
        'tuesday' => 28,
        'wednesday' => 22,
        'thursday' => 30,
    ];

    echo "\n--- 別例: ソート前の配列 ---\n";
    print_r($temperatures);

    // 値で降順にソートするためのコールバック関数
    $success = uasort($temperatures, function (int $a, int $b): int {
        return $b <=> $a; // 比較の順序を反転して降順にする
    });

    if ($success) {
        echo "\n--- 別例: ソート後の配列 (値で降順) ---\n";
        print_r($temperatures);
    } else {
        echo "\n別例の配列のソートに失敗しました。\n";
    }
}

// 関数の実行
demonstrateUasort();

?>

PHPのuasort関数は、ユーザーが定義した独自の比較ロジックに基づいて、配列をソートするための機能です。特に、連想配列のキーと値の関連付けをソート後も維持したい場合に役立ちます。

最初の引数&$arrayには、ソートしたい配列を渡します。この引数は参照渡しのため、uasort関数を実行すると、元の配列自体がソートされた状態に直接変更されます。 二番目の引数$callbackには、配列内の2つの要素を比較するための関数を指定します。このコールバック関数は、比較対象の2つの要素を受け取り、最初の要素が2番目の要素より小さい場合は負の値を、等しい場合は0を、大きい場合は正の値を返す必要があります。PHP 7以降では、<=>(spaceship operator)を使うことで、この比較処理を簡潔に記述できます。

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

提供されたサンプルコードでは、まず連想配列$fruitsを値の昇順にソートする例が示されています。次に、別の連想配列$temperaturesを値の降順にソートする例も紹介されており、コールバック関数の比較順序を反転させることで、ソート順を柔軟に変更できることが分かります。この関数は、配列を特定の条件で並べ替えたいときに非常に便利です。

uasort関数は、第一引数で指定した配列を直接変更します(参照渡し)。そのため、元の配列がソート後の状態になる点に注意が必要です。この関数は、配列のインデックス(キー)と値の関連付けを維持したまま、ユーザー定義の比較関数に基づいて値をソートします。コールバック関数は、比較する2つの要素を受け取り、昇順なら負、等しいなら0、降順なら正の整数を返すように実装してください。PHP 7以降では<=>(宇宙船演算子)が比較処理を簡潔に書く際に便利です。また、関数の戻り値はbool型なので、ソートが成功したかどうかを必ず確認し、適切なエラーハンドリングを行うようにしてください。

uasortで配列を逆順ソートする

<?php

/**
 * Demonstrates how to use uasort to sort an array by its values in reverse order,
 * while maintaining the original key-value associations.
 */
function sortArrayValuesReverseWithUasort(): void
{
    $fruits = [
        'id_d' => 'lemon',
        'id_a' => 'orange',
        'id_c' => 'banana',
        'id_b' => 'apple',
    ];

    echo "Original array:\n";
    print_r($fruits);

    // Define a comparison function for reverse alphabetical sorting.
    // The uasort function requires a callable that takes two arguments ($a, $b)
    // and returns an integer:
    // - Less than 0 if $a should come before $b (in ascending order).
    // - 0 if $a and $b are considered equal.
    // - Greater than 0 if $a should come after $b (in ascending order).
    // To achieve reverse (descending) order, we swap the arguments in strcmp
    // compared to a standard ascending comparison, or reverse its result.
    $reverseCompare = function (string $val1, string $val2): int {
        return strcmp($val2, $val1); // Compare $val2 to $val1 for reverse order
    };

    // Sort the array by its values using the custom comparison function.
    // uasort maintains the key-value associations.
    $success = uasort($fruits, $reverseCompare);

    if ($success) {
        echo "\nArray after uasort (reverse alphabetical by value):\n";
        print_r($fruits);
    } else {
        echo "\nFailed to sort the array.\n";
    }
}

// Execute the demonstration function.
sortArrayValuesReverseWithUasort();

PHPのuasort関数は、配列の値をユーザーが定義した比較ルールに従ってソートする際に使用します。この関数は、ソート後も元のキーと値の関連性を維持する点が特徴です。

第一引数&$arrayには、ソート対象となる配列を参照渡しで指定します。関数が実行されると、この配列自体がソートされた状態で変更されます。第二引数$callbackには、要素同士を比較するための関数(callable)を渡します。この比較関数は2つの引数($a, $b)を取り、負の値を返せば$a$bより小さい、0を返せば等しい、正の値を返せば$a$bより大きい、とuasort関数に伝えます。uasortはソートが成功した場合はtrueを、失敗した場合はfalseを返します。

サンプルコードでは、文字列のフルーツ名を値に持つ連想配列$fruitsを定義しています。この配列の値を逆順(降順)にソートするため、$reverseCompareという比較関数を用意しています。この関数内でstrcmp($val2, $val1)とすることで、通常の昇順比較であるstrcmp($val1, $val2)と比べて比較の順序が逆になり、結果として降順ソートを実現しています。uasort関数に$fruits$reverseCompareを渡して実行すると、元のキーと値の関連を保ったまま、値が逆アルファベット順に並べ替えられます。これにより、例えば「lemon」が「apple」より前に来るような結果が得られます。

uasort関数は、配列の値を基準にソートし、元のキーと値の関連付けを維持します。引数に渡した配列は直接変更されるため、元の状態を保持したい場合は事前にコピーを取ってください。ソート順を決める比較関数は、二つの要素を受け取り、$aが$bより前に来るべきなら負、等しければゼロ、$aが$bより後に来るべきなら正の整数を返します。サンプルコードでは降順ソートのため、比較関数内で引数の順序を逆にして比較しています。uasortはソートの成否を真偽値で返しますので、処理が成功したかを確認することが重要です。比較関数は扱うデータの型(文字列、数値など)に合わせて適切に選んでください。

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