第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)
関連する問題
- PHPの条件分岐に関する次の記述のうち、誤っているものはどれか。
- 次のコードの実行結果として正しいものはどれか。 ```php $i = 1; while ($i <= 5) { print $i; $i++; } ```
- PHPのループ制御に関する次の記述のうち、正しいものはどれか。
- PHPの条件分岐に関する次の記述のうち、正しいものはどれか。
- 次のコードの実行結果として正しいものはどれか。 ```php for ($i = 0; $i < 5; $i++) { if ($i == 2) { continue; } if ($i == 4) { break; } print $i; } ```