【PHP8.x】uasort関数の使い方
uasort関数は、ユーザー定義の比較関数を使用して配列をソートする関数です。この関数は、配列の要素の値に基づいて並べ替える際に、各要素のインデックス(キー)と値の関連付けを維持するという特徴があります。特に、連想配列のようにキーと値のペアが重要な意味を持つ場合に非常に役立ちます。
uasort関数を使用するには、ソートしたい配列と、比較ロジックを記述したコールバック関数(比較関数)を引数として渡します。この比較関数は、ソート対象の配列から2つの要素を受け取り、それらを比較して順序を決定するための整数値を返します。具体的には、最初の要素が2番目の要素より小さい場合は負の数、等しい場合は0、大きい場合は正の数を返すように実装します。
この関数を実行すると、元の配列が比較関数のルールに従って並べ替えられます。ソートが成功した場合はtrue、失敗した場合はfalseが戻り値として返されます。例えば、商品リストを価格順や名前順に並べ替えたいが、商品のID(キー)と情報(値)の関連は崩したくない、といったシナリオでこのuasort関数を活用することができます。
基本的な使い方
構文(syntax)
<?php
$array = ['banana' => 3, 'apple' => 1, 'cherry' => 2];
uasort($array, function ($a, $b) {
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
});
?>
引数(parameters)
array &$array, callable $callback
- array &$array: ソート対象の連想配列。参照渡しで渡されるため、関数内で変更されると元の配列も変更されます。
- callable $callback: 配列の各要素を比較するために使用されるコールバック関数。2つの引数(配列の要素)を受け取り、それらを比較した結果を返します。
戻り値(return)
bool
uasort関数は、指定された連想配列の要素を、キーと値のペアを保持したまま、ユーザー定義の比較関数に基づいてソートします。ソートが成功した場合は TRUE を、失敗した場合は FALSE を返します。
サンプルコード
PHP uasortで連想配列を値でソートする
<?php
/**
* uasort関数を使用して、連想配列を値でソートする例です。
* インデックスと値の関連付けは維持されます。
*/
function demonstrateUasort(): void
{
// ソートする連想配列を定義
$fruits = [
'apple' => 3,
'banana' => 1,
'cherry' => 2,
'date' => 4,
];
echo "--- ソート前の配列 ---\n";
print_r($fruits);
// uasort関数を使用して、配列を値で昇順にソート
// コールバック関数は、2つの要素を比較し、
// $a < $b の場合は負の値、
// $a == $b の場合は 0、
// $a > $b の場合は正の値を返します。
$success = uasort($fruits, function (int $a, int $b): int {
return $a <=> $b; // PHP 7以降で利用可能な比較演算子 (spaceship operator)
});
if ($success) {
echo "\n--- ソート後の配列 (値で昇順) ---\n";
print_r($fruits);
} else {
echo "\n配列のソートに失敗しました。\n";
}
// 別な例:値で降順にソート
$temperatures = [
'monday' => 25,
'tuesday' => 28,
'wednesday' => 22,
'thursday' => 30,
];
echo "\n--- 別例: ソート前の配列 ---\n";
print_r($temperatures);
// 値で降順にソートするためのコールバック関数
$success = uasort($temperatures, function (int $a, int $b): int {
return $b <=> $a; // 比較の順序を反転して降順にする
});
if ($success) {
echo "\n--- 別例: ソート後の配列 (値で降順) ---\n";
print_r($temperatures);
} else {
echo "\n別例の配列のソートに失敗しました。\n";
}
}
// 関数の実行
demonstrateUasort();
?>
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で配列を逆順ソートする
<?php
/**
* Demonstrates how to use uasort to sort an array by its values in reverse order,
* while maintaining the original key-value associations.
*/
function sortArrayValuesReverseWithUasort(): void
{
$fruits = [
'id_d' => 'lemon',
'id_a' => 'orange',
'id_c' => 'banana',
'id_b' => 'apple',
];
echo "Original array:\n";
print_r($fruits);
// Define a comparison function for reverse alphabetical sorting.
// The uasort function requires a callable that takes two arguments ($a, $b)
// and returns an integer:
// - Less than 0 if $a should come before $b (in ascending order).
// - 0 if $a and $b are considered equal.
// - Greater than 0 if $a should come after $b (in ascending order).
// To achieve reverse (descending) order, we swap the arguments in strcmp
// compared to a standard ascending comparison, or reverse its result.
$reverseCompare = function (string $val1, string $val2): int {
return strcmp($val2, $val1); // Compare $val2 to $val1 for reverse order
};
// Sort the array by its values using the custom comparison function.
// uasort maintains the key-value associations.
$success = uasort($fruits, $reverseCompare);
if ($success) {
echo "\nArray after uasort (reverse alphabetical by value):\n";
print_r($fruits);
} else {
echo "\nFailed to sort the array.\n";
}
}
// Execute the demonstration function.
sortArrayValuesReverseWithUasort();
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
はソートの成否を真偽値で返しますので、処理が成功したかを確認することが重要です。比較関数は扱うデータの型(文字列、数値など)に合わせて適切に選んでください。