第4章 制御構文 / 第1回 模擬試験

次のコードの実行結果として正しいものはどれか。 ```php $num = ['zero', 'one', 'three']; $num[3] = 'four'; $num[2] = 'two'; print ('【loop_A】'); for ($i = 0, $count_num = count($num); $i < $count_num; $i++) { print ($num[$i] . ','); } print ('【loop_B】'); foreach ($num as $i => $n) { print ($i . ','); } ```

【loop_A】zero,one,three,four,【loop_B】0,1,2,3,
【loop_A】zero,one,two,four,【loop_B】0,1,2,3, 正解
【loop_A】zero,one,three,four,【loop_B】0,1,3,2,
【loop_A】zero,one,two,three,【loop_B】0,1,3,2,
解説
配列のキーへの代入は、そのキーが「既に存在するか」によって挙動が変わります。既存のキーへ代入すると、値だけが上書きされ、配列内での挿入順(イテレーション順)は変わりません。 ```php $num = ['zero', 'one', 'three']; // キー0,1,2が挿入される(値: zero, one, three) $num[3] = 'four'; // 新しいキー3を末尾に追加 $num[2] = 'two'; // 既存のキー2の値だけを上書き(挿入順は変わらない) ``` この時点で`$num`は`[0=>'zero', 1=>'one', 2=>'two', 3=>'four']`という順序のまま保持されます。 ・`for`ループ(【loop_A】)はキー0から順にアクセスするため`zero, one, two, four,`。 ・`foreach`ループ(【loop_B】)は配列の「挿入順」でキーを走査するため、既存キー2への再代入では順序が動かず`0, 1, 2, 3,`になります。 例: ``` $num = ['zero', 'one', 'three']; $num[3] = 'four'; $num[2] = 'two'; var_export($num); // [0 => 'zero', 1 => 'one', 2 => 'two', 3 => 'four'] ``` 「既存キーへの再代入では要素の並び順が変わらない」という点が、この設問で最も間違えやすいポイントです。もし`unset($num[2])`してから`$num[2] = 'two';`のように「一度削除してから追加」した場合は、キー2が末尾に移動し順序が変わります。 (参照: 独習PHP 第4版 第4章 制御構文 4.2.5節 foreach命令 p.147 / 第2章 2.4節 配列 p.71)

あわせて読みたい解説記事