PHPプログラミングでは、foreachをはじめとしたループ処理内で、次のループにスキップしたい場合にcontinueを使用します。
そこで今回は、PHPでforeachのループをcontinueでスキップする方法について詳しく解説していきます。また、混同しがちなbreakとの違いやループ階層の指定などについても紹介しています。ぜひご覧ください。
目次
PHPでのcontinueとは
PHPプログラミングのcontinueは、foreach文をはじめとしたfor文やwhile文などのループ処理で、ループ内に書かれた残りの処理を行わず、次のループにスキップするときに使用されます。
continueは、他のプログラミング言語でも同様の機能でサポートされており、プログラマーにとっては基本中の基本ともいえる知識といえます。
breakとの違い
continueとセットで紹介される機能にbreakがあります。continueとbreakの違いは次の通りです。
- continue:次のループにスキップする
- break:ループ処理を終了する
continueであれば、ループ構造の終了条件を果たすまで処理が繰り返されます。しかし、breakの場合は、ループ構造の終了条件を達成していなくても、ループ処理を強制終了します。
一見、同じような機能をもつcontinueとbreakですが、動作は全くの別物なので、選択を間違えないように注意しましょう。
continueでforeachのループをスキップする方法
それでは、実際にforeachのループ処理内で、continueを使ってスキップした場合の動作を確認してみましょう。
例として、5人の名前と点数が格納されている配列の中から、60点以上の人の名前と点数を出力するサンプルコードを紹介します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php $grades = array('Aさん'=>62, 'Bさん'=>86, 'Cさん'=>57, 'Dさん'=>78, 'Eさん'=>33); foreach ($grades as $name => $score){ if ($score < 60){ continue; } echo $name .':' .$score .'点'; echo '<br />'; } ?> |
Bさん:86点
Dさん:78点
上記サンプルコードでは、配列grades内に格納された点数が60点以上だった場合には、ループ処理内で名前と点数を出力しています。しかし、60点未満だった場合には、名前を出力する処理の前に次のループにスキップするため、名前と点数は出力されません。
continueを使うときの注意点
PHPだけでなく、各言語を使ったプログラミングにおいて、continueを使う際には注意が必要です。その注意点について紹介しますので、まずは次のサンプルコードをみてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php $grades = array('Aさん'=>62, 'Bさん'=>86, 'Cさん'=>57, 'Dさん'=>78, 'Eさん'=>33); foreach ($grades as $name => $score){ if ($score < 60){ echo $name .':不合格'; echo '<br />'; continue; } echo $name .':合格'; echo '<br />'; } ?> |
Bさん:合格
Cさん:不合格
Dさん:合格
Eさん:不合格
上記サンプルコードでは、配列grades内に格納された点数が60点未満だった場合にも、名前と不合格通知を出力した上で、次のループにスキップしています。
当たり前のことにはなりますが、continueで次のループにスキップする前に処理を行っているため、不合格者の名前も問題なく出力されます。
お気づきの方もいるかと思いますが、continueを使う多くの場合、if文の書き方を工夫すればcontinueは不要になります。そして、continueやbreakの使い過ぎは、処理の複雑化につながります。
それでは、continueやbreakはどのような処理で使えば良いのでしょうか?
それは、ソースコードをわかりやすくするために使うのが良いでしょう。例えば、上記サンプルコードの場合、一連の処理の目的が「合格者名を抽出する」ことであれば、次のようなコードにすると可読性が高まります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php $grades = array('Aさん'=>62, 'Bさん'=>86, 'Cさん'=>57, 'Dさん'=>78, 'Eさん'=>33); foreach ($grades as $name => $score){ // 不合格者は無視する if ($score < 60){ continue; } echo $name; echo '<br />'; } ?> |
Bさん
Dさん
今回必要な情報は「合格者の名前」なので、点数が60点未満の場合、continueでループをスキップしています。これも、if文の書き方を変えてcontinueを使わずに処理することもできます。しかし、上記のように書くことで、このソースコードでは「不合格者を無視する」という意思表示になります。
これにより、一連の処理の流れや目的がわかりやすくなり、ソースコードの可読性が高まったといえるでしょう。
なお、breakの場合は、ループ処理中にエラーが発生した場合などに使うのが一般的です。不測の事態が起きたため、「処理を中断する」という意思表示が伝わりやすくなります。
continueで階層を指定してforeachのループをスキップする
PHPプログラミングにおいて、foreachの中にforeachが記述されていることがあります。このような多重ループに対して、continueはスキップする階層を指定できます。
スキップする階層を指定したcontinueの書き方は次の通りです。
1 |
continue 階層数; |
書き方自体は簡単で、continueの後にスキップしたい階層数を引数にするだけです。引数が何も書かれていない場合は、「continue 1;」と同様の意味になります。
それでは、実際に階層数を指定して、ループ処理をスキップしたcontinueの動作を確認してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
<?php $num1 = ['1','2','3']; $num2 = ['4','5','6']; $num3 = ['7','8','9']; echo '【continue 1】'; echo '<br />'; foreach ($num1 as $a){ echo $a; foreach ($num2 as $b){ echo $b; foreach ($num3 as $c){ if ($c == '8'){ continue 1; } echo $c; } } echo '<br />'; } echo '<br />'; echo '【continue 2】'; echo '<br />'; foreach ($num1 as $a){ echo $a; foreach ($num2 as $b){ echo $b; foreach ($num3 as $c){ if ($c == '8'){ continue 2; } echo $c; } } echo '<br />'; } ?> |
1479579679
2479579679
3479579679
【continue 2】
1475767
2475767
3475767
上記サンプルコードの通り、「continue 2」を指定した場合には、num3に対するループ処理がスキップされたため、「break」を使ったときのような動作になりました。
多重ループに対して、continueを使うときは、スキップする範囲が意図したものになっているか注意するようにしましょう。
まとめ
PHPでは、foreachなどのループ処理をスキップしたい場合にcontinueを使います。breakとは動作が違うので、2つの違いを理解した上で使い分けをしましょう。
なお、continueはソースコードの書き方次第で不要となる場合が多々あります。continueを使うことで処理が複雑化しないか、注意するようにしましょう。
また、多重ループ内でcontinueを使う際には、スキップする階層を指定することもできます。continueの機能を十分に理解して、用途に合わせた使い方ができるようになりましょう。