Menu
Coddy logo textTech

'usort' によるカスタムソート

CoddyのPHPジャーニー「論理とフロー」セクションの一部 — レッスン 25/68。

PHPの組み込みソート関数が特定のニーズを満たさない場合、usort()関数は、要素をどのように比較し、順序付けるかを正確に定義できるようにすることで、究極の柔軟性を提供します。この関数は、配列と、ソートロジックを決定するために作成したカスタム比較関数を受け取ります。

比較関数は配列から2つの要素を受け取り、整数を返す必要があります。最初の要素が2番目の要素より前に来るべき場合は負の数、それらが等しい場合は0、最初の要素が2番目の要素より後に来るべき場合は正の数を返します。

<?php
function compareByLength($a, $b) {
    return strlen($a) - strlen($b);
}

$words = ["elephant", "cat", "butterfly", "dog"];
usort($words, "compareByLength");
print_r($words);
// 出力: Array ( [0] => cat [1] => dog [2] => elephant [3] => butterfly )
?>

この例では、比較関数は文字列の長さの差を計算します。strlen($a) - strlen($b) が負の数を返すとき、それは最初の文字列の方が短く、ソートされた配列の中で最初に来るべきであることを意味します。

他のPHPのソート関数と同様に、usort() は元の配列を直接変更します。この強力な関数は、文字列の長さ、カスタムのビジネスロジック、あるいは複雑な複数フィールドの比較など、想像できるあらゆる基準でソートする可能性を広げます。

quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

challenge icon

チャレンジ

簡単

1つの入力を受け取ります。それはJSON形式の製品価格の配列です。入力を読み取り、JSON文字列を配列に変換し、価格を昇順にソートする比較関数を作成し、その比較関数とともに usort() を使用して配列をソートし、print_r() を使用してソートされた配列を出力してください。

入力形式: 数値のJSON配列を含む1行(例: [29.99,15.50,42.00,8.75,33.25]

期待される出力: 価格の昇順にソートされ、print_r() を使用して表示された配列

チートシート

usort()関数は、ソートロジックを定義する比較関数を受け入れることで、カスタムソートを可能にします。

比較関数は2つの要素を受け取り、以下を返す必要があります:

  • 負の数:最初の要素が2番目の要素の前に来る
  • ゼロ:要素は等しい
  • 正の数:最初の要素が2番目の要素の後に来る
<?php
function compareByLength($a, $b) {
    return strlen($a) - strlen($b);
}

$words = ["elephant", "cat", "butterfly", "dog"];
usort($words, "compareByLength");
print_r($words);
// 出力: Array ( [0] => cat [1] => dog [2] => elephant [3] => butterfly )
?>

他のPHPソート関数と同様に、usort()は元の配列を直接変更します。

自分で試してみよう

<?php
// 入力を読み込む
$input = fgets(STDIN);
$prices = json_decode($input, true);

// TODO: 比較関数を作成し、usort() を使用して配列をソートする

// ソートされた配列を出力する
print_r($prices);
?>
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

論理とフローのすべてのレッスン