PHP continueとbreak

2010/09/20

continueとbreak、使いこなしてますか?

「continue 2;」や「break 2;」とすると2重ループを抜けることが可能。
まずはソースのサンプル。

  1. <?
  2. $count = 0;
  3. echo “start\n”;
  4. while (true) {
  5.  $count++;
  6.  echo “one : $count\n”;
  7.  while (true) {
  8.   echo “two\n”;
  9.   if ($count < 3) {
  10.    continue 2;
  11.   } else {
  12.    break 2;
  13.   }
  14.  }
  15. }
  16. echo “end\n”;
  17. ?>

まず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」を出力させて、おしまい。

上記のソースの結果は下記。

  1. start
  2. one : 1
  3. two
  4. one : 2
  5. two
  6. one : 3
  7. two
  8. end

ソースの10行目「continue 2;」は「break;」でもいけた。
「二つ前のループ処理の条件式判定」まで戻るってことは「一つ前のループを終了」ってことと同じ意味になるからと思いきや上記のソースだから問題なくいけただけだった。
下記はソースの10行目「continue 2;」を「break;」に変更、15行目に「echo」文を追加。

  1. <?
  2. $count = 0;
  3. echo “start\n”;
  4. while (true) {
  5.  $count++;
  6.  echo “one : $count\n”;
  7.  while (true) {
  8.   echo “two\n”;
  9.   if ($count < 3) {
  10.    break;
  11.   } else {
  12.    break 2;
  13.   }
  14.  }
  15.  echo “3rd\n”;
  16. }
  17. echo “end\n”;
  18. ?>

「continue 2;」だったから「4行目のループ処理の条件式判定」に戻ってたけど「break;」すると「7行目のループを終了」させる。
「終了」だから「15行目のecho」は実行されてしまう。
結果、下記のようになる。

  1. start
  2. one : 1
  3. two
  4. 3rd
  5. one : 2
  6. two
  7. 3rd
  8. one : 3
  9. two
  10. end

新着(ニュース関連以外)

2018-07-26
年賀状で「新春」とか書くけど・・・何故なんだろうと8月を目前にした今、疑問に思った。
2018-05-16
PHPで画像のヘッダ情報(?)の「Orientation」を元に画像回転させたい。
2018-03-05
Android Studioをインストール。エミュレータを軽くするトコまで終わらせたかったけど、挫折した。
2018-02-23
プッシュ通知について調べてた時にでてきたServiceWorker。そのServiceWorkerについてのメモ。
2017-12-13
jqueryで取得したDOM要素をオブジェクトじゃなくて、配列で受け取りたい