第4章 制御構文 / 第4回 模擬試験
次のコードの実行結果として正しいものはどれか。 ```php $list = ['a' => 1, 'b' => 2, 'c' => 3]; foreach ($list as $k => &$v) { $v *= 10; } unset($v); print implode(",", $list); ```
10,20,30
正解
1,2,3
10,20,3
エラーが発生する
解説
`foreach ($list as $k => &$v)`のように値を`&`付きの参照渡しでループすると、ループ変数`$v`は元の配列の要素そのものへの参照になります。そのため、ループ内で`$v *= 10;`のように`$v`を変更すると、元の配列`$list`の該当要素の値も直接書き換わります。
例:
```
$list = ['a' => 1, 'b' => 2, 'c' => 3];
foreach ($list as $k => &$v) {
$v *= 10;
}
unset($v); // 参照を解除
print implode(",", $list); // 10,20,30
```
`foreach`終了後に`unset($v)`をしていない場合、`$v`が最後の要素への参照として残ってしまい、その後に別の`foreach`で`$v`という変数名を(参照なしで)再利用すると、意図せず配列の最後の要素を書き換えてしまうバグの原因になります。この`unset($v);`は定番の対策です。
(参照: 独習PHP 第4版 第4章 制御構文 4.2.6節 値変数の参照渡し p.150〜151)
関連する問題
- 次のコードの実行結果として正しいものはどれか。 ```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 . ','); } ```
- PHPの条件分岐に関する次の記述のうち、誤っているものはどれか。
- 次のコードの実行結果として正しいものはどれか。 ```php $i = 1; while ($i <= 5) { print $i; $i++; } ```
- PHPのループ制御に関する次の記述のうち、正しいものはどれか。
- PHPの条件分岐に関する次の記述のうち、正しいものはどれか。