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

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

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

作成日: 更新日:

基本的な使い方

『uksortメソッドは、ユーザーが定義した比較関数を用いて、配列のキーに基づいてエントリをソートするメソッドです。このメソッドは、RecursiveArrayIteratorオブジェクトが現在指している配列に対して操作を行います。ソートの順序は、引数として渡されるコールバック関数によって決定されます。このコールバック関数は2つのキーを引数として受け取り、それらを比較した結果を整数値で返さなければなりません。具体的には、最初のキーが2番目のキーより小さいと判断した場合は負の整数を、等しい場合は0を、大きい場合は正の整数を返すように実装します。この仕組みにより、通常の辞書順や数値順では実現できない、独自の複雑なルールに基づいたキーのソートが可能になります。ソート処理はキーと値の関連性を維持したまま行われるため、ソート後も各キーに対応する値は変わりません。メソッドの返り値は、ソートが成功した場合にはtrueを、失敗した場合にはfalseを返します。多次元配列を扱う際に、特定の階層の配列を特殊な順序で並べ替えたい場合に有効なメソッドです。』

構文(syntax)

1<?php
2
3$array = ['zulu' => 1, 'alpha' => 2, 'bravo' => 3];
4$iterator = new RecursiveArrayIterator($array);
5
6$iterator->uksort(fn($key1, $key2) => strcmp($key1, $key2));
7
8?>

引数(parameters)

callable $callback

  • callable $callback: 配列のキーと値を受け取り、ソート順を決定するコールバック関数

戻り値(return)

bool

このメソッドは、配列のキーを昇順にソートする処理が成功したかどうかを示す真偽値(bool)を返します。ソートが成功した場合は true を、失敗した場合は false を返します。

サンプルコード

PHP RecursiveArrayIterator::uksort でキーをソートする

1<?php
2
3/**
4 * RecursiveArrayIterator の uksort メソッドの使用例を示します。
5 * uksort は、ユーザー定義の比較関数を使用して、イテレータが扱う配列のキーをソートします。
6 *
7 * この例では、キーをアルファベット順(逆順)にソートします。
8 */
9
10// ソート対象となる連想配列を準備します。
11$data = [
12    'banana' => '黄色い果物',
13    'apple' => '赤い果物',
14    'cherry' => '小さな赤い果物',
15    'date' => '甘いドライフルーツ',
16];
17
18echo "--- 元の配列 ---\n";
19print_r($data);
20
21// RecursiveArrayIterator のインスタンスを作成します。
22$iterator = new RecursiveArrayIterator($data);
23
24// uksort に渡す比較関数を定義します。
25// この関数は2つのキーを受け取り、それらの相対的な順序を示す整数を返します。
26// strcmp($a, $b) は $a < $b の場合に負、 $a == $b の場合に 0、 $a > $b の場合に正を返します。
27// キーを逆アルファベット順にソートするため、$key2 と $key1 を比較します。
28$compareFunction = function (string $key1, string $key2): int {
29    return strcmp($key2, $key1); // $key2 が $key1 より大きい場合(アルファベット順で後)に負の値を返し、結果的に逆順になります。
30};
31
32// RecursiveArrayIterator::uksort メソッドを呼び出し、キーをソートします。
33// ソートが成功した場合は true、失敗した場合は false を返します。
34$isSorted = $iterator->uksort($compareFunction);
35
36if ($isSorted) {
37    echo "\n--- キーを逆アルファベット順にソートした後の配列 ---\n";
38    // uksort はイテレータが内部的に保持する配列を直接変更します。
39    // getArrayCopy() を使用して、ソート後の配列を取得し表示します。
40    print_r($iterator->getArrayCopy());
41} else {
42    echo "\nキーのソートに失敗しました。\n";
43}
44
45// 別な例:キーを通常のアルファベット順にソート
46echo "\n--- キーを通常のアルファベット順にソートした後の配列 ---\n";
47$iteratorNormalSort = new RecursiveArrayIterator($data); // 新しいイテレータで元のデータを再度設定
48
49$compareFunctionNormal = function (string $key1, string $key2): int {
50    return strcmp($key1, $key2); // $key1 と $key2 を比較することで通常のアルファベット順に。
51};
52
53$isSortedNormal = $iteratorNormalSort->uksort($compareFunctionNormal);
54
55if ($isSortedNormal) {
56    print_r($iteratorNormalSort->getArrayCopy());
57} else {
58    echo "\nキーのソートに失敗しました。\n";
59}
60
61?>

PHP 8のRecursiveArrayIterator::uksortメソッドは、RecursiveArrayIteratorクラスが内部的に保持する配列のキーを、ユーザーが定義した比較関数に基づいてソートする機能を提供します。このメソッドは、callable $callbackという引数を一つ受け取ります。この$callback関数は、ソート対象となる2つのキーを受け取り、それらの相対的な順序を示す整数値(最初のキーが2番目のキーより小さい場合は負、等しい場合は0、大きい場合は正)を返すように実装する必要があります。メソッドの実行結果はbool型で返され、ソートが成功した場合はtrue、失敗した場合はfalseを示します。

サンプルコードでは、まず連想配列のキーを逆アルファベット順にソートする例を示しています。比較関数内でstrcmp($key2, $key1)とすることで、通常のアルファベット順とは逆の順序を実現しています。uksortメソッドはイテレータが扱う配列のデータを直接変更するため、ソート後の結果はgetArrayCopy()メソッドで取得できます。また、キーを通常のアルファベット順にソートする別の例も示しており、比較関数でstrcmp($key1, $key2)を使用することで、ユーザーの要件に応じて柔軟にキーの並び替えができることを確認できます。

RecursiveArrayIterator::uksortは、イテレータが扱う配列の「キー」を、指定した比較関数に基づいてソートするメソッドです。最も重要なのは、引数として渡す比較関数(callable $callback)の定義方法です。この関数はソート対象となる二つのキーを受け取り、それらの相対的な順序を示す整数(負の数、ゼロ、正の数)を正確に返す必要があります。ソートロジックはここで決まるため、想定通りの結果を得るには関数の内容を慎重に実装してください。また、uksortはイテレータ内部の配列を直接変更する破壊的な操作であるため、元の配列を保持したい場合は事前にコピーを取る必要があります。メソッドの戻り値はソートの成否を示すブール値なので、処理の成功を確認することをお勧めします。

関連コンテンツ