連想配列の結合
CoddyのPHPジャーニー「論理とフロー」セクションの一部。レッスン 15/68。
array_merge()はインデックス付きarrayに対してシームレスに機能しますが、associative arrayを扱う場合、その動作は大きく変わります。主な違いは、mergeされるarray間で重複する文字列キーをどのように処理するかです。
associative arrays をマージする際、両方の arrays に同じ文字列キーが含まれている場合、後の array の値が先の array の値を上書きします。
<?php
$defaults = ["theme" => "light", "language" => "english", "notifications" => true];
$userSettings = ["theme" => "dark", "notifications" => false];
$finalConfig = array_merge($defaults, $userSettings);
print_r($finalConfig);
// Outputs: Array ( [theme] => dark [language] => english [notifications] => false )
?>「theme」が「light」から「dark」に変わり、「notifications」がtrueからfalseに変わった一方で、上書きされなかったため「language」は「english」のままであることに注目してください。この動作により、array_merge()は、ユーザー設定によってデフォルト値を上書きしたいconfigurationシステムに最適です。
引数の順序は重要です。関数呼び出しで後に指定された arrays の値が、先に指定された値より優先されます。この上書き動作は文字列キーにのみ適用されます。数値キーは、インデックス付き arrays と同様に、常に連続したインデックスとして再割り当てされます。
チャレンジ
簡単2つの入力を受け取ります。どちらもJSON形式で、デフォルト設定の配列とユーザー設定の配列です。両方の入力を読み取り、それぞれのJSON文字列を連想配列に変換し、array_merge()を使用して結合し(ユーザー設定がデフォルト設定を上書きします)、print_r()を使用して結合された設定を出力します。
入力形式: 2行。それぞれの行には、連想配列を表すJSONオブジェクトが含まれます(例: {"theme":"light","language":"english"})
期待される出力: ユーザー設定がデフォルト値を上書きした、結合された設定の配列。print_r()を使用して表示されます。
自分で試してみよう
<?php
// 2つのJSON入力を読み取る
$defaultConfig = fgets(STDIN);
$userPreferences = fgets(STDIN);
// JSON文字列を連想配列に変換する
$defaultArray = (array)json_decode($defaultConfig, true);
$userArray = (array)json_decode($userPreferences, true);
// TODO: 配列をマージするコードを以下に書いてください
// マージされた設定を出力する
print_r($mergedConfig);
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理とフローのすべてのレッスン
自分で練習してみよう: PHPオンラインコンパイラ