PHP入門 ループの制御(breack、continue)

while/do~while、for/foreach命令では、あらかじめ決められた終了条件を満たしたタイミングでグループを終了します。しかし、処理によっては、特定の条件を満たしたところで強制的にグループを中断したい、あるいは、特定の周回だけをスキップしたい場合があります。そのような場合は、breack命令やcontinue命令を使用します。

breack命令

breack命令は、現在のループを強制的に中断する命令です。一般的にfor/foreach、while/do~while命令の中で利用します。

例:1~100の値を加算していき、合計値が1000を超えたところでループを抜けます。

<?php
$sum = 0;
for($i = 1; $i <= 100; $i++){
  $sum += $i;
  if ($sum > 1000){ break; }
}
print "合計が1000を超えるのは、1~{$i}を加算したときです。";
実行結果
実行結果

continue命令

ループそのものを完全に抜けてしまうbreack命令に対して、現在の周回だけをスキップし、ループそのものは継続して実行するのが、continue命令です。

例:1~100の範囲で偶数値のみを加算し、その合計値を求めるサンプルです。

<?php
$sum = 0;
for($i = 1; $i <= 100; $i++){
  if ($i % 2 !== 0){ continue; }
  $sum += $i;
}
print "合計値は{$sum}です。";
実行結果
実行結果

入れ子のループを中断/スキップする

制御命令はお互いに入れ子(ネスト)にできます。ネストされたループの中で、break/continue命令を使用した場合、既定では最も内側のループを抜け/スキップします。

例:九九表を作成する

変数$resultが40を超えたところで、break命令を実行しています。これによって内側のループを脱出するので、結果として、積が40以下である九九表を出力できるわけです。

<?php
for($i = 1; $i < 10; $i++){
  for($j = 1; $j < 10; $j++){
    $result = $i * $j;
    if ($result > 40){break;}
    print "{$result}  ";
  }
  print '<br />';
}
実行結果

一度でも積が40を超えたら九九表の出力自体を停止したい場合、次のようにします。

 if ($result > 40){break 2;}

このように、breack命令の末尾に抜けるループの階層を指定します。ここでは2を指定しているので、内側/外側の二重ループをまとめて抜けます。

実行結果
実行結果

構文:breack/continue命令

breack ループ階層数
continue ループ階層数

switchブロック配下のcontinue命令

switchブロックの中では、continue命令はbreak命令と同じように動作します。

 <?php
for($i = 1; $i < 4; $i++){
  $result = 0;
  switch ($i){
    case 1:
    case 3:
      $result = $i * $i;
      break;
    case 2:
      continue;
   }
  print "{$i}の2乗は{$result}です。<br />";
  }

switch命令の中でのcontinue命令はbreack命令と同じように動作するので、「case 2:」ブロックは何もせずにswitch命令を抜けるだけで、直後のprint命令を実行してします。「$i = 2」の周回をスキップさせたい場合には、「continue 2;」のようにします。これでswitch、forのネストされた「ループ」をスキップします。

実行結果
実行結果
これは、ループの中のswitch命令でbreak命令を使う場合にも同じです。switch命令からその外側のループブロックを抜けるには、「break 2;」のように記述する必要があります。