こんにちは!フリーエンジニアのヤマシタです。
PHPではfor、while、foreachなどの繰り返し文でcontinueを使用して、ループ処理をスキップすることができます。
この記事では、
・continueとは
・continueの使い方(for、while、foreach)
という基本的な内容から、
・レベル(階層数)を指定する
・continueの注意点
・breakとの違い
などの応用的な使い方に関しても解説していきます。
今回はそんな繰り返し処理でスキップする方法について、わかりやすく解説します!
continueとは
continueとは、 for, foreach, whileなどの繰り返し処理で一定の条件により、処理をスキップして次の繰り返し処理から始めるときに使用します。
繰り返し処理をスキップしたい場合には、繰り返し処理内で以下のように記述します。
書き方1:
continue;
continueは、オプションで引数を指定することが可能で、指定した引数によりループ構造のレベルの数を指定することができます。
書き方2:
continue [階層数]
なお、デフォルト値は1で設定されているため、ループの最後までスキップされます。
また、PHPのバージョン5.4.0からcontinueの引数に数値型の変数や0を渡すことはできなくなりました。
記述例:
foreach($配列名 as $値){ continue [数値] }
continueの使い方
ここでは、実際にcontinueを使って繰り返し処理をスキップする方法を紹介します。
サンプルプログラム(while)
$cnt = 0; while($cnt < 5){ $cnt = $cnt + 1; //$cntの値が3だったら処理をスキップ if ($cnt == 3){ echo 'continue<br>'; continue; } echo '$cnt = '.$cnt.'<br>'; }
実行結果:
$cnt = 1 $cnt = 2 continue $cnt = 4 $cnt = 5
このサンプルではwhile文の繰り返し処理の中で、変数$cntを1ずつ加算していきます。
if文の分岐処理で$cntが3だったらcontinueを実行して、繰り返し処理をスキップしています。
続いて、for文の使用例です。
サンプルプログラム(for)
for( $cnt = 0; $cnt < 5; $cnt++ ) { if ($cnt == 3){ echo 'continue<br>'; continue; } echo '$cnt = '.$cnt.'<br>'; }
実行結果:
$cnt = 0 $cnt = 1 $cnt = 2 continue $cnt = 4
while文と同じように「$cnt == 3」のときに処理がスキップしていることがわかりますね!
続けてforeach文です。
サンプルプログラム(foreach)
$fruits1 = ['apple', 'orange', "", 'banana', 'pineapple']; foreach($fruits1 as $value){ //配列の要素が空の場合はcontinueでループをスキップする if (empty($value)){ continue; }else{ $fruits2[] = $value; } } foreach($fruits2 as $value){ echo $value; echo '<br>'; }
実行結果:
apple orange banana pineapple
サンプルでは、empty関数を使用して、配列の要素が空の場合はcontinueを指定して処理をスキップし、ループ処理を初めから実施しています。
レベル(階層数)を指定する
ここでは、繰り返し文が階層構造(ネスト)になっている場合のcontinueの使い方について見ていきましょう。
階層構造で、どの階層の繰り返し文の箇所まで処理をスキップするか指定する場合は、前述したようにcontinueのオプションにレベルを指定します。
以下にfor文を使用して、continueでレベルを指定する方法を記述します。
サンプルプログラム
$fruits1 = ['apple1', 'orange1', 'melon1']; $fruits2 = ['apple2', 'orange2', 'melon2']; $fruits3 = ['apple3', 'orange3', 'melon3']; for($i = 0; $i < count($fruits1); $i++){ echo $fruits1[$i]; echo '<br>'; for($j = 0; $j < count($fruits2); $j++){ echo $fruits2[$j]; echo '<br>'; for($k = 0; $k < count($fruits3); $k++){ echo $fruits3[$k]; echo '<br>'; continue 3; } } }
実行結果:
apple1 apple2 apple3 orange1 apple2 apple3 melon1 apple2 apple3
紹介したサンプルでは、continueでレベルを3で指定しているため、現在のループとその上の階層のループ、更にその上のループの、3重のループを抜けることができます。
レベルを2で指定した場合は2重のループを抜けるため、$fruits2の階層のforeachからループが再開されます。
continueの注意点
continueは、繰り返し文を途中でスキップするときに便利ですが、多重構造の繰り返し文でcontinueを使用する場合は、continueの特性をよく理解した上で使用する必要があります。
例えば以下の4重構造のループで各配列の値$value1〜$value4を最下層の繰り返し文で、if文で比較するとします。
そのとき判定文でfalseの場合、continueでレベルを指定してループをスキップすると、全ての値が比較されずにループ処理が終了します。
foreach($array1 as $value1){ foreach($array2 as $value2){ foreach($array3 as $value3){ foreach($array4 as $value4){ if (条件文){ 〜何らかの処理〜 } else{ continue 4; } 〜何らかの処理〜 } } } }
特に配列の要素数が膨大な場合は、意図しない結果となったときに解析で時間を要してしまいます。
そのため、多重構造での繰り返し文でcontinueを使用するときは、とくに注意して使用するようにしましょう。
breakとの違い
continueは、ループの残りの処理をスキップするのに対して、breakはループ処理を終了するときに使用します。
サンプルプログラム
for( $cnt = 0; $cnt < 5; $cnt++ ) { if ($cnt == 3){ echo 'break<br>'; break; } echo '$cnt = '.$cnt.'<br>'; }
実行結果:
$cnt = 0 $cnt = 1 $cnt = 2 break
breakも繰り返し処理において使用する頻度が高いため、使い方をしっかりと覚えておきましょう。
breakに関しては、以下の記事で詳しく解説しています。
ループ処理についてもっと詳しく知りたい方へ
ループ処理のさまざまな使い方については、以下の記事にまとめていますので、ぜひ参考にしてくださいね!
<解説している内容>
・foreach文の基本的な使い方
・foreach文のさまざまな使い方
・for文の基本的な使い方
・for文のさまざまな使い方
・while文の基本的な使い方
・while文のさまざまな使い方
・ループの途中で処理を終了する方法
・ループの途中で処理をスキップする方法
まとめ
ここでは繰り返し処理をスキップするcontinueについて、
・continueとは
・continueの使い方(for、while、foreach)
・レベル(階層数)を指定する
・continueの注意点
・breakとの違い
などについて解説しました。
繰り返し処理で、continueやbreakといった処理は使用頻度が高いと言えますので、この機会にぜひ覚えておきましょう。
もし、繰り返し処理でループをスキップする方法を忘れてしまったら、この記事を思い出してくださいね!