PHP、JS ループ処理内のbreak,continue

作成日:2019-03-19, 更新日:2019-03-19

基本

・break - ループから抜ける
・continue - 以後のループ内の処理は無視

ソース breakの流れ continueの流れ
for (〇〇〇) {
   処理A
   if ( 条件 ) {
     break; // or 「continue」
   }
   処理B
}
1.「処理A」を実行
2.「条件」が
 ・「真」ならループを抜ける
 ・「偽」なら「処理B」を実行
3.「1」にもどる
1.「処理A」を実行
2.「条件」が
 ・「真」なら「1」へ
 ・「偽」なら「処理B」を実行
3.「1」にもどる

ループ内のループでbreak,continue

・ループ内でループをさせて、その中でbreak,continueを使いたいって時

▼ループ内でループさせる

for (〇〇〇) {     // ループ処理1
  for (〇〇〇) {   // ループ処理2
    処理A
    if ( 条件 ) {
      break; // or 「continue」
    }
    処理B
  }
}

→breakにしてもcontinueにしても「ループ処理2」が対象となる。

子のループではなく、親のループから抜けたい

・break(or continue)で「ループ処理2」ではなく「ループ処理1」を対象したい。

PHP

・「break 2」などのように親の階層を指定

for (〇〇〇) {   // ループ処理1
  for (〇〇〇) { // ループ処理2
    if ( 条件1-1 ) {
      break 2; // 2つ上のループを抜ける→「ループ処理1」を抜ける
    }
    else if (条件1-2) {
      break; // ループを抜ける→「ループ処理2」を抜ける
    }
    
    if ( 条件2-1 ) {
      continue 2; // 2つ上のループまで以後の処理をスキップ→「ループ処理1」に戻る
    }
    else if (条件2-2) {
      continue; // ループまで以後の処理をスキップ→「ループ処理2」に戻る
    }
   }
}

Javascript

・ラベルを作り、「break ラベル」などのように指定する。

loop_p: for (〇〇〇) {   // ループ処理1
  loop_c: for (〇〇〇) { // ループ処理2
    if ( 条件1-1 ) {
      break loop_p; // 「ラベル:loop_p」を抜ける
    }
    else if (条件1-2) {
      break loop_c; // 「ラベル:loop_c」を抜ける
    }
    
    if ( 条件2-1 ) {
      continue loop_p; // 「ラベル:loop_p」に戻る
    }
    else if (条件2-2) {
      continue loop_c; // 「ラベル:loop_c」に戻る
    }
   }
}