PHP continueとbreak
「continue 2;」や「break 2;」とすると2重ループを抜けることが可能。
まずはソースのサンプル。
- <?
- $count = 0;
- echo “start\n”;
- while (true) {
- $count++;
- echo “one : $count\n”;
- while (true) {
- echo “two\n”;
- if ($count < 3) {
- continue 2;
- } else {
- break 2;
- }
- }
- }
- echo “end\n”;
- ?>
まず2行目で「$count」に「0」を代入。
3行目で「start」を出力して改行(\n)。
4行目でループに入って、5行目で「$count」に「+1」してるから「$count」の値が「1」になる。
6行目で「one」と「$count」の値を出力して改行。このとき出力されるのは「one : 1」だな。
7行目でループ内のループに突入。
8行目で「two」を出力して改行。
9行目の条件分岐では「$countの値が3未満」ってなってるから「真」なんで10行目の「continue 2」。
以降の処理をスキップしてループ処理の条件式判定まで戻る。「continue 2」だから「2つ前のループ処理の条件式判定」まで戻る。
ループは「7行目」と「4行目」にあるんで「4行目のループ処理の条件式判定」まで戻る。
4行目に戻って、5行目で「$count」で「+1」だから値が「2」に変更。
6・7・8・9行目と進んでいって10行目の「continue 2」。
4行目に戻って、5行目で「$count」で「+1」だから値が「3」に変更。
6・7・8・9行目と進んでいくんだけど、今回は「$count」の値が「3」だから11行目の「else」にはいって12行目の「break 2」ってのを実行。「break」は「ループ処理を終了」で「2」がついてるから「ループ処理を2回終了」。
「7行目」のループを終了させて、「4行目」のループに戻ってそれも終了。
16行目で「end」を出力させて、おしまい。
上記のソースの結果は下記。
- start
- one : 1
- two
- one : 2
- two
- one : 3
- two
- end
ソースの10行目「continue 2;」は「break;」でもいけた。
「二つ前のループ処理の条件式判定」まで戻るってことは「一つ前のループを終了」ってことと同じ意味になるからと思いきや上記のソースだから問題なくいけただけだった。
下記はソースの10行目「continue 2;」を「break;」に変更、15行目に「echo」文を追加。
- <?
- $count = 0;
- echo “start\n”;
- while (true) {
- $count++;
- echo “one : $count\n”;
- while (true) {
- echo “two\n”;
- if ($count < 3) {
- break;
- } else {
- break 2;
- }
- }
- echo “3rd\n”;
- }
- echo “end\n”;
- ?>
「continue 2;」だったから「4行目のループ処理の条件式判定」に戻ってたけど「break;」すると「7行目のループを終了」させる。
「終了」だから「15行目のecho」は実行されてしまう。
結果、下記のようになる。
- start
- one : 1
- two
- 3rd
- one : 2
- two
- 3rd
- one : 3
- two
- end