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

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

作成日: 更新日:

基本的な使い方

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

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

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

構文(syntax)

1<?php
2$array = ['banana' => 3, 'apple' => 1, 'cherry' => 2];
3
4uasort($array, function ($a, $b) {
5    if ($a == $b) {
6        return 0;
7    }
8    return ($a < $b) ? -1 : 1;
9});
10?>

引数(parameters)

array &$array, callable $callback

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

戻り値(return)

bool

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

サンプルコード

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

1<?php
2
3/**
4 * uasort関数を使用して、連想配列を値でソートする例です。
5 * インデックスと値の関連付けは維持されます。
6 */
7function demonstrateUasort(): void
8{
9    // ソートする連想配列を定義
10    $fruits = [
11        'apple' => 3,
12        'banana' => 1,
13        'cherry' => 2,
14        'date' => 4,
15    ];
16
17    echo "--- ソート前の配列 ---\n";
18    print_r($fruits);
19
20    // uasort関数を使用して、配列を値で昇順にソート
21    // コールバック関数は、2つの要素を比較し、
22    // $a < $b の場合は負の値、
23    // $a == $b の場合は 0、
24    // $a > $b の場合は正の値を返します。
25    $success = uasort($fruits, function (int $a, int $b): int {
26        return $a <=> $b; // PHP 7以降で利用可能な比較演算子 (spaceship operator)
27    });
28
29    if ($success) {
30        echo "\n--- ソート後の配列 (値で昇順) ---\n";
31        print_r($fruits);
32    } else {
33        echo "\n配列のソートに失敗しました。\n";
34    }
35
36    // 別な例:値で降順にソート
37    $temperatures = [
38        'monday' => 25,
39        'tuesday' => 28,
40        'wednesday' => 22,
41        'thursday' => 30,
42    ];
43
44    echo "\n--- 別例: ソート前の配列 ---\n";
45    print_r($temperatures);
46
47    // 値で降順にソートするためのコールバック関数
48    $success = uasort($temperatures, function (int $a, int $b): int {
49        return $b <=> $a; // 比較の順序を反転して降順にする
50    });
51
52    if ($success) {
53        echo "\n--- 別例: ソート後の配列 (値で降順) ---\n";
54        print_r($temperatures);
55    } else {
56        echo "\n別例の配列のソートに失敗しました。\n";
57    }
58}
59
60// 関数の実行
61demonstrateUasort();
62
63?>

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で配列を逆順ソートする

1<?php
2
3/**
4 * Demonstrates how to use uasort to sort an array by its values in reverse order,
5 * while maintaining the original key-value associations.
6 */
7function sortArrayValuesReverseWithUasort(): void
8{
9    $fruits = [
10        'id_d' => 'lemon',
11        'id_a' => 'orange',
12        'id_c' => 'banana',
13        'id_b' => 'apple',
14    ];
15
16    echo "Original array:\n";
17    print_r($fruits);
18
19    // Define a comparison function for reverse alphabetical sorting.
20    // The uasort function requires a callable that takes two arguments ($a, $b)
21    // and returns an integer:
22    // - Less than 0 if $a should come before $b (in ascending order).
23    // - 0 if $a and $b are considered equal.
24    // - Greater than 0 if $a should come after $b (in ascending order).
25    // To achieve reverse (descending) order, we swap the arguments in strcmp
26    // compared to a standard ascending comparison, or reverse its result.
27    $reverseCompare = function (string $val1, string $val2): int {
28        return strcmp($val2, $val1); // Compare $val2 to $val1 for reverse order
29    };
30
31    // Sort the array by its values using the custom comparison function.
32    // uasort maintains the key-value associations.
33    $success = uasort($fruits, $reverseCompare);
34
35    if ($success) {
36        echo "\nArray after uasort (reverse alphabetical by value):\n";
37        print_r($fruits);
38    } else {
39        echo "\nFailed to sort the array.\n";
40    }
41}
42
43// Execute the demonstration function.
44sortArrayValuesReverseWithUasort();
45

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エンジニア