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

次のコードの実行結果として正しいものはどれか。 ```php outer: for ($i = 0; $i < 3; $i++) { for ($j = 0; $j < 3; $j++) { if ($j == 1) { continue 2; } print "$i-$j "; } } ```

0-0 0-1 0-2 1-0 1-1 1-2 2-0 2-1 2-2
0-0 1-0 2-0 正解
0-0 0-1 1-0 1-1 2-0 2-1
エラーが発生する
解説
`continue 2;`は、内側のループだけでなく「2段階外側」までを対象にスキップを行います(自分自身のループを1段階目として数えます)。`$j == 1`になった時点で内側の`for`ループを打ち切り、外側の`for`ループの次のイテレーション(`$i`のインクリメント)へ進みます。 そのため、内側ループは各`$i`につき`$j = 0`のときの`print`しか実行されず、出力は`0-0 1-0 2-0 `になります。 例: ``` for ($i = 0; $i < 3; $i++) { for ($j = 0; $j < 3; $j++) { if ($j == 1) { continue 2; } print "$i-$j "; } } // 出力: 0-0 1-0 2-0 ``` `continue`(引数なし、`continue 1`と同じ)は内側ループだけをスキップしますが、`continue 2`は外側ループの残り(この例では`$j`のループ全体)もまとめてスキップする点が違いです。 (参照: 独習PHP 第4版 第4章 制御構文 4.3.3節 入れ子のループを中断/スキップする p.155〜156)

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