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

【PHP8.x】RecursiveArrayIterator::uasort()メソッドの使い方

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

作成日: 更新日:

基本的な使い方

uasortメソッドは、ユーザーが独自に定義した比較関数を用いて、イテレータが現在指している配列の値を基準にソートを実行するメソッドです。このソートの最大の特徴は、値が並べ替えられた後も、それぞれの値に対応する元のキーとの関連性が維持される点です。ソートの順序は、引数として渡すコールバック関数によって決まります。この関数は、比較する2つの値を引数として受け取り、最初の値が2番目の値より小さい、等しい、または大きいかに応じて、それぞれ負の整数、ゼロ、正の整数を返すように実装する必要があります。この仕組みにより、単純な昇順や降順だけでなく、オブジェクトの特定のプロパティを比較するなど、開発者が定義した複雑なルールに基づいて連想配列を柔軟に並べ替えることが可能になります。メソッドはソートが成功した場合にtrueを、失敗した場合にfalseを返します。

構文(syntax)

1<?php
2
3$array = [
4    'key_d' => 'lemon',
5    'key_a' => 'orange',
6    'key_b' => 'banana',
7    'key_c' => 'apple',
8];
9
10$iterator = new RecursiveArrayIterator($array);
11
12// ユーザー定義の比較関数を使い、キーと値の関連を維持したまま、値でソートします。
13$iterator->uasort(function (string $a, string $b): int {
14    return $a <=> $b;
15});
16
17?>

引数(parameters)

callable $callback

  • callable $callback: 配列の各要素とキーを比較するためのコールバック関数を指定します。この関数は、2つの引数(要素の値)を受け取り、それらを比較した結果を整数で返します。返り値は、比較結果に応じて以下のようになります。
    • 0 未満: $a は $b より小さい
    • 0: $a および $b は等しい
    • 0 より大きい: $a は $b より大きい

戻り値(return)

bool

uasortメソッドは、配列の要素をユーザー定義の比較関数でソートし、その成功・失敗を示す真偽値(trueまたはfalse)を返します。

サンプルコード

PHP: uasortで配列をキー保持ソートする

1<?php
2
3/**
4 * RecursiveArrayIterator::uasort() の使用例を示します。
5 *
6 * このメソッドは、ユーザー定義の比較関数を使用して、
7 * イテレータがラップする配列をインデックス(キー)を保持したままソートします。
8 * システムエンジニアを目指す初心者が、配列のカスタムソートを理解するのに役立ちます。
9 */
10function demonstrateUasortExample(): void
11{
12    // ソート対象となる連想配列を準備します。
13    // 各要素は、IDをキーに持つユーザーデータです。
14    $users = [
15        'userC' => ['name' => 'Charlie', 'age' => 30, 'city' => 'Tokyo'],
16        'userA' => ['name' => 'Alice', 'age' => 25, 'city' => 'Osaka'],
17        'userB' => ['name' => 'Bob', 'age' => 35, 'city' => 'Nagoya'],
18        'userD' => ['name' => 'David', 'age' => 25, 'city' => 'Fukuoka'],
19    ];
20
21    echo "--- ソート前のデータ ---\n";
22    print_r($users);
23
24    // RecursiveArrayIterator のインスタンスを作成します。
25    // これにより、配列をオブジェクト指向の方法でイテレートできるようになります。
26    $iterator = new RecursiveArrayIterator($users);
27
28    // uasort メソッドを呼び出し、ユーザー定義の比較関数を使ってソートします。
29    // ここでは、まず 'age' で昇順にソートし、'age' が同じ場合は 'name' で昇順にソートします。
30    // 配列のキー ('userA', 'userB' など) はソート後も保持されます。
31    $isSorted = $iterator->uasort(function (array $a, array $b): int {
32        // 最初の比較基準: 'age' (年齢)
33        if ($a['age'] !== $b['age']) {
34            return ($a['age'] < $b['age']) ? -1 : 1;
35        }
36
37        // 'age' が同じ場合は、次の比較基準: 'name' (名前)
38        // strcmp() は文字列を比較し、適切な整数値を返します。
39        return strcmp($a['name'], $b['name']);
40    });
41
42    echo "\n--- 'age' で昇順、次に 'name' で昇順ソート後のデータ ---\n";
43    // uasort は元のイテレータがラップする内部配列を直接変更します。
44    // ソートされた配列のコピーを取得するには、getArrayCopy() を使用します。
45    print_r($iterator->getArrayCopy());
46
47    // uasort メソッドの戻り値を確認します。
48    // ソートが成功した場合は true、失敗した場合は false を返します。
49    echo "\nRecursiveArrayIterator::uasort() の戻り値: " . ($isSorted ? 'true' : 'false') . "\n";
50}
51
52// サンプルコードを実行します。
53demonstrateUasortExample();

PHPのRecursiveArrayIterator::uasort()メソッドは、RecursiveArrayIteratorが内部に持つ配列を、ユーザー定義の比較関数を使ってソートするための機能です。このメソッドの大きな特徴は、ソート後も配列のインデックス(キー)が元の状態を保持される点です。

引数callable $callbackには、配列の要素の大小関係を決定するための比較関数を指定します。この関数は2つの配列要素を受け取り、最初の要素が2番目の要素より小さい場合は負の値、等しい場合はゼロ、大きい場合は正の値を返します。これにより、数値や文字列だけでなく、複数のキーを持つ連想配列など、複雑な条件でのソートが可能になります。

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

サンプルコードでは、ユーザーの年齢と名前を含む連想配列をソートしています。比較関数では、まず年齢で昇順に並べ、年齢が同じ場合には名前で昇順に並べるという、複数の条件に基づいたカスタムソートを実行しています。RecursiveArrayIteratorのインスタンスに対してuasort()を呼び出すことで、内部の配列が直接変更され、キーを保ったまま目的の順番に並び替えられます。ソート後の配列は、getArrayCopy()メソッドで取得し確認することができます。

RecursiveArrayIterator::uasort()は、イテレータが保持する元の配列を、ユーザー定義の比較関数に基づいてソートします。このメソッドは配列のキーを保持したまま、元の配列を直接変更しますので、ソート前のデータを残したい場合は、事前に配列のコピーを作成してください。

比較関数は、2つの要素を比較し、順序に応じて負の整数(最初の要素が小さい)、0(同じ)、正の整数(最初の要素が大きい)を正確に返す必要があります。この戻り値がソートの基準となり、順序を決定します。ソート後の最終的な配列を取得するには、$iterator->getArrayCopy()を使用してください。uasort()メソッド自体の戻り値は、ソート処理が成功したかどうかを示す真偽値です。

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

1<?php
2
3/**
4 * RecursiveArrayIterator::uasort メソッドの使用例。
5 *
6 * このスクリプトは、多次元配列を RecursiveArrayIterator でラップし、
7 * uasort メソッドを使ってユーザー定義の比較関数に基づいて配列の要素をソートします。
8 * uasort は、キーと値の関連性を維持したままソートを行います。
9 */
10
11// 複数の商品情報を含む多次元配列を定義します。
12// 各キー('itemA'など)に対応する値が、商品の詳細情報(配列)です。
13$products = [
14    'itemA' => ['name' => 'Laptop', 'price' => 1200, 'stock' => 5],
15    'itemB' => ['name' => 'Mouse', 'price' => 25, 'stock' => 20],
16    'itemC' => ['name' => 'Keyboard', 'price' => 75, 'stock' => 10],
17    'itemD' => ['name' => 'Monitor', 'price' => 300, 'stock' => 8],
18    'itemE' => ['name' => 'Webcam', 'price' => 75, 'stock' => 15], // priceがKeyboardと同じ
19];
20
21echo "<h3>ソート前の商品リスト:</h3>";
22echo "<pre>";
23print_r($products);
24echo "</pre>";
25
26// RecursiveArrayIterator を使用して多次元配列をラップします。
27// これにより、配列をイテレータとして扱い、イテレータメソッドを使用できるようになります。
28$iterator = new RecursiveArrayIterator($products);
29
30// uasort メソッドを使って、イテレータ内の最上位の要素(この場合、各商品情報配列)をソートします。
31// uasort は、ユーザー定義の比較関数に基づいてソートし、元のキーと値の関連性を維持します。
32// ここでは、商品の 'price' (価格) を基準に昇順でソートします。
33// 比較関数は2つの要素 ($a, $b) を受け取り、
34// $a が $b より小さい場合は負の値、等しい場合は 0、大きい場合は正の値を返します。
35// PHP 7 以降で導入された結合比較演算子 (<=>) を使うと、簡潔に記述できます。
36$sorted = $iterator->uasort(function (array $a, array $b): int {
37    // まず価格で比較します。
38    $priceComparison = $a['price'] <=> $b['price'];
39
40    // 価格が同じ場合は、商品名で比較して順序を決定します。
41    if ($priceComparison === 0) {
42        return $a['name'] <=> $b['name'];
43    }
44
45    return $priceComparison;
46});
47
48echo "<h3>価格で昇順、価格が同じ場合は名前で昇順にソート後の商品リスト (uasort):</h3>";
49// uasort は元のイテレータの内部配列を直接変更するため、
50// ソート後の状態は $iterator オブジェクトから取得できます。
51// print_r で配列の内容を表示するために getArrayCopy() を使用します。
52echo "<pre>";
53print_r($iterator->getArrayCopy());
54echo "</pre>";
55
56// uasort メソッドの戻り値は bool です。
57// ソートが成功した場合は true、失敗した場合は false を返します。
58if ($sorted) {
59    echo "<p>ソートは成功しました。</p>";
60} else {
61    echo "<p>ソートは失敗しました。</p>";
62}
63
64?>

PHPのRecursiveArrayIterator::uasortメソッドは、多次元配列の要素を、ユーザーが定義した比較関数に基づいてソートするための機能です。このメソッドは、配列の要素を並べ替える際に、元のキーと値の関連性を維持したままソートを行う点が特徴です。

この機能を利用するには、ソートしたい配列をRecursiveArrayIteratorクラスでラップします。これにより、配列がイテレータとして扱えるようになり、uasortのようなイテレータメソッドが利用可能になります。uasortの引数callable $callbackには、ソート基準となる比較関数を指定します。この比較関数は二つの要素を受け取り、その大小関係を示す整数(負の値、0、正の値)を返す必要があります。

サンプルコードでは、商品リストを価格で昇順に、価格が同じ場合は商品名で昇順にソートする例を示しています。uasortは、この比較関数に従ってイテレータ内部の配列を直接変更します。メソッドの戻り値はbool型で、ソート処理が成功した場合はtrue、失敗した場合はfalseが返されます。これにより、ソートが意図通りに実行されたかを確認できます。

RecursiveArrayIterator::uasortは、イテレータがラップする多次元配列の最上位の要素を、キーを維持したままユーザー定義の比較関数でソートします。このメソッドは元のイテレータの内部配列を直接変更するため、戻り値はソートの成否を示す真偽値です。ソート結果は元のイテレータからgetArrayCopy()などで取得してください。比較関数は、2つの要素の相対順序に応じて負、ゼロ、正の数を返す必要があります。PHP 7以降の結合比較演算子<=>は、比較関数を簡潔に記述するのに役立ちます。また、同値要素の相対順序は通常保証されないため、特定の順序が必要な場合は、比較関数内で追加の基準を設けるようにしてください。

関連コンテンツ