【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はソートの成否を真偽値で返しますので、処理が成功したかを確認することが重要です。比較関数は扱うデータの型(文字列、数値など)に合わせて適切に選んでください。