Menu
Coddy logo textTech

連想配列を値でソート

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

連想配列を扱う際、キーと値の関係を保持したまま、値に基づいてソートする必要があることがよくあります。PHPはこの目的のために2つの専用関数を提供しています。昇順用の asort() と降順用の arsort() です。

値に基づいて昇順でソートする asort() の仕組みは以下の通りです:

<?php
$students = [
    "Alice" => 85,
    "Bob" => 92,
    "Charlie" => 78,
    "Diana" => 96
];

asort($students);
print_r($students);
// Outputs: Array ( [Charlie] => 78 [Alice] => 85 [Bob] => 92 [Diana] => 96 )
?>

成績が低い順から高い順に並べ替えられましたが、各生徒の名前はそれぞれの成績と正しくペアになったままであることに注目してください。これが、通常の sort() に対する asort() の主な利点です。つまり、キーと値の関連付けが維持されます。

降順にするには、arsort() も同様に動作しますが、値を大きい順(降順)に並べ替えます:

<?php
arsort($students);
print_r($students);
// 出力: Array ( [Diana] => 96 [Bob] => 92 [Alice] => 85 [Charlie] => 78 )
?>

両方の関数は、添字配列の対応する関数と同様に、元の配列を直接変更します。そのため、生徒の成績や商品の価格、あるいはキーと値のペアを保持したまま値に基づいてソートする必要があるあらゆる状況において、データの整理に最適です。

quiz icon腕試し

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

quiz icon腕試し

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

quiz icon腕試し

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

challenge icon

チャレンジ

簡単

1つの入力を受け取ります。それは従業員名とその給与の連想配列で、JSON形式です。入力を読み込み、JSON文字列を配列に変換し、arsort() を使用して従業員を給与の降順(高い順)にソートし、ソートされた配列を print_r() を使用して出力してください。

入力形式: 従業員名をキー、給与を値とするJSONオブジェクトを含む1行(例: {"John":45000,"Sarah":52000,"Mike":38000,"Lisa":61000}

期待される出力: 給与の値で降順にソートされた連想配列を、print_r() を使用して表示したもの

チートシート

asort() を使用して、キーと値の関係を保持したまま、連想配列を値の昇順でソートします:

<?php
$students = [
    "Alice" => 85,
    "Bob" => 92,
    "Charlie" => 78,
    "Diana" => 96
];

asort($students);
print_r($students);
// 出力: Array ( [Charlie] => 78 [Alice] => 85 [Bob] => 92 [Diana] => 96 )
?>

arsort() を使用して、連想配列を値の降順でソートします:

<?php
arsort($students);
print_r($students);
// 出力: Array ( [Diana] => 96 [Bob] => 92 [Alice] => 85 [Charlie] => 78 )
?>

どちらの関数も、通常の sort() とは異なり、元の配列を直接変更し、キーと値の関連付けを維持します。

自分で試してみよう

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

// JSONを連想配列に変換する
$employees = (array)json_decode($input, true);

// TODO: 以下に、配列を給与の降順でソートするコードを記述してください


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

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

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