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

【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型なので、ソートが成功したかどうかを必ず確認し、適切なエラーハンドリングを行うようにしてください。

PHP uasortでキーを保持してソートする

1<?php
2
3/**
4 * uasort関数を使用して、配列の値をユーザー定義の比較関数でソートし、
5 * その際にキーと値の関連が保持されることを示すサンプルコードです。
6 *
7 * uasortは、キー(配列の識別子)と値(データ)のペアを維持したまま、
8 * 値に基づいてソートを行いたい場合に非常に便利です。
9 */
10
11// ソート対象の連想配列を準備します。
12// キーは文字列、値は数値とします。
13$items = [
14    'banana' => 3,
15    'apple' => 1,
16    'orange' => 2,
17    'grape' => 4,
18];
19
20echo "--- ソート前の配列 ---" . PHP_EOL;
21print_r($items);
22
23// uasort関数を使って配列をソートします。
24// 第一引数にはソートしたい配列を、第二引数には比較を行うコールバック関数を指定します。
25// コールバック関数は2つの引数($a, $b)を受け取り、これらは比較対象の「値」です。
26// この関数は、キーを保持したまま値をソートします。
27uasort($items, function ($valueA, $valueB) {
28    // $valueAと$valueBは、配列の「値」です。
29    // キーには直接アクセスできませんが、uasortの特性としてキーは保持されます。
30    // ここでは値の昇順にソートするため、$valueAから$valueBを引きます。
31    // $valueAが$valueBより小さい場合、負の値を返して$valueAを前に配置します。
32    // PHP 7以降では、宇宙船演算子 (spaceship operator) <=> を使用すると簡潔に記述できます。
33    return $valueA <=> $valueB;
34});
35
36echo "--- ソート後の配列 (値で昇順) ---" . PHP_EOL;
37print_r($items);
38
39// 出力結果から、値は昇順にソートされましたが、
40// 元のキー('apple', 'orange'など)はそれぞれの値と関連付けられたまま移動していることが確認できます。

PHPのuasort関数は、配列の要素をユーザーが定義した比較ルールに基づいてソートし、その際に元のキーと値の関連性を保持したい場合に使用する関数です。特に、連想配列のようにキー自体に意味があるデータをソートする際に非常に役立ちます。

この関数は、第一引数にソートしたい配列を「参照渡し」で受け取ります。これは、関数内で元の配列自体が直接変更されることを意味します。第二引数には、2つの要素の値を比較し、それらの順序を決定するための独自のロジックを持つ「コールバック関数」を指定します。

コールバック関数は、比較対象となる2つの値を受け取り、最初の値が2番目の値より小さい場合は負の数、等しい場合はゼロ、大きい場合は正の数を返します。サンプルコードでは、PHP 7以降で利用可能な宇宙船演算子<=>を用いることで、値の昇順ソートを簡潔に記述しています。uasortの大きな特徴は、この比較結果に基づいて値が並び替えられても、各値が元々持っていたキーはその値と関連付けられたまま移動し、失われない点です。

この関数は、ソートが成功した場合はtrueを、失敗した場合はfalseをブール値として戻り値で返します。このようにuasortは、データの構造的な関連性を保ちながら、柔軟かつカスタマイズ可能なソートを実現するための便利な機能です。

uasort関数は、引数で渡された配列を直接変更(参照渡し)する破壊的な関数です。ソート前の配列の状態を保持したい場合は、事前にarray_sliceなどを用いて配列のコピーを作成してから使用してください。この関数は配列の「値」に基づいてソートを行いますが、連想配列などの「キーと値の関連」が維持される点が重要な特徴です。比較用のコールバック関数には配列の「値」が引数として渡されますが、キーには直接アクセスできません。もしキーに基づいてソートを行いたい場合はuksort関数を利用するなど、目的に応じた適切なソート関数を選択することが重要です。比較関数の戻り値(負の数、ゼロ、正の数)は、要素の順序を決定するため、その意味を正確に理解して記述してください。PHP 7以降では、宇宙船演算子(<=>)を用いると簡潔に比較を記述できます。

PHP uasortで多次元配列をソートする

1<?php
2
3/**
4 * uasort() を使用して多次元配列をソートするサンプルコード。
5 * 配列のキーと値の関連付けは維持されます。
6 */
7
8// ソート対象となる多次元配列を準備します。
9// ここでは、商品の情報を持つ連想配列の配列としています。
10$products = [
11    'product_A' => ['name' => 'Laptop', 'price' => 1200, 'stock' => 5],
12    'product_B' => ['name' => 'Mouse', 'price' => 25, 'stock' => 50],
13    'product_C' => ['name' => 'Keyboard', 'price' => 75, 'stock' => 20],
14    'product_D' => ['name' => 'Monitor', 'price' => 300, 'stock' => 10],
15    'product_E' => ['name' => 'Webcam', 'price' => 75, 'stock' => 15],
16];
17
18echo "--- ソート前の配列 ---" . PHP_EOL;
19print_r($products);
20
21// uasort() を使用して配列をソートします。
22// 第1引数にソートしたい配列 ($products) を参照渡しで渡します。
23// 第2引数には比較を行うためのコールバック関数を渡します。
24// PHP 8 では、アロー関数 (fn) を使用して簡潔なコールバック関数を記述できます。
25// このコールバック関数は、2つの要素 ($a, $b) を受け取り、それらを比較します。
26// - $a が $b より小さい場合は -1 を返します。
27// - $a と $b が等しい場合は 0 を返します。
28// - $a が $b より大きい場合は 1 を返します。
29// ここでは、商品の 'price' (価格) を基準に昇順でソートし、
30// 価格が同じ場合は 'stock' (在庫) を基準に昇順でソートします。
31$isSorted = uasort($products, fn ($a, $b) =>
32    $a['price'] <=> $b['price'] ?: $a['stock'] <=> $b['stock']
33);
34
35if ($isSorted) {
36    echo PHP_EOL . "--- ソート後の配列 (価格昇順、次に在庫昇順) ---" . PHP_EOL;
37    print_r($products);
38} else {
39    echo PHP_EOL . "--- ソートに失敗しました ---" . PHP_EOL;
40}

PHPのuasort関数は、配列の要素を、ユーザーが指定した比較関数に基づいてソートする際に用いられます。この関数は、ソート後も配列のキーと値の関連付けを維持するという特徴があります。このサンプルコードでは、商品の名前、価格、在庫などの情報を持つ多次元連想配列をソートする具体的な方法を示しています。

uasort関数は、第1引数にソート対象の配列を直接変更するため参照渡しで受け取ります。第2引数には、配列の2つの要素を比較するためのコールバック関数を指定します。ここではPHP 8で利用できるアロー関数 fn を用いて、より簡潔に比較ロジックを記述しています。このコールバック関数は、比較結果として、第1引数の要素が第2引数の要素より小さい場合は負の数、等しい場合はゼロ、大きい場合は正の数を返します。

サンプルコードの比較ロジックでは、最初に商品の価格を昇順で比較し、価格が同じ商品については在庫を昇順で比較する、という複数条件でのソートを行っています。これは宇宙船演算子 (<=>) とエルビス演算子 (?:) を組み合わせることで簡潔に表現されています。uasort関数は、ソート処理が成功した場合はtrueを、失敗した場合はfalseを戻り値として返しますので、ソートの成否を確認することができます。

uasort関数は第一引数に指定した配列を参照渡しで直接変更しますので、元の配列の内容が変わる点にご注意ください。この関数は配列のキーと値の関連付けを維持したまま、第二引数で渡すコールバック関数の比較結果に基づいて要素をソートします。コールバック関数は二つの要素を受け取り、一つ目が二つ目より小さい場合は負の値、等しい場合はゼロ、大きい場合は正の値を返します。サンプルコードではPHP 8の宇宙船演算子(<=>)とアロー関数を使用し、価格と在庫の二つの基準で多次元配列をソートしています。ソートの成否は戻り値の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はソートの成否を真偽値で返しますので、処理が成功したかを確認することが重要です。比較関数は扱うデータの型(文字列、数値など)に合わせて適切に選んでください。

関連コンテンツ

関連プログラミング言語