PHPでは、whileやforなど複数の繰り返し処理が使えますが、その処理を中断するコマンドがbreakです。しかし、文法は知っているものの、break文の具体的な使い方が解らない、という方もいるでしょう。今回は、そのような方に、PHPのbreak文の使い方を具体的な例を使って解説します。
目次
break文の基本
今回紹介するbreak文は、PHPにおける繰り返し処理やswitch文の中に使われて、その処理を中断するコマンドです。しかし、正しく使わないと、意図しない動作のプログラムを書いていた、といったこともあります。次から、break文の文法について解説します。
break文の文法
break文は、PHPで利用できるfor、foreach、while、do-while、switch構造の実行を途中で終了させるコマンドです。なお、繰り替えし処理の中で使われて場合は、その処理そのものを途中で中断させます。また、switch文で使われた場合は、一致したcase文から続く処理を中断させます。
そして、使い方は簡単で、break文単体、または、引数としてネストしたループ構造を抜ける数を指定するだけです。
単体で利用した例
1 |
break; |
引数を指定した例
1 |
break 2; |
なお、break単体で使用した場合は、引数に1が指定されたものとして、1つのだけのネストを抜ける機能として使われます。
繰り返し処理の中断する使い方
break文は繰り返し処理を中断させるために、よく使われます。ただし、PHPでは、while文やfor文の処理の中にbreakだけ書いただけでは、繰り返しそのものを中断してしまいます。
誤った使われ方
1 2 3 4 5 |
$i=0; while(true) { break; $i+=1; } |
上記の例は、while文の繰り返し処理の中に、break文単体を書いたことで、while文が最初に括弧内の条件をチェックした直後に、beakで中断してしまうので、繰り返しになりません。
そのため、if文と組み合わせて、ある条件に一致した場合のみ、break文を実行するのが正しい使い方です。
正しい使われ方
1 2 3 4 5 |
$i=0; while(true) { $i+=1; if( $i == 5 ) break; } |
switch文におけるbreakの使い方
switch文は、同じ変数を異なる値とcase文で比較し、一致した値に応じた処理を実行するために使われます。ただし、case文から処理を始めるだけで、処理を中断させるにはbreak文が必要です。そのため、PHPでは、case文毎にbreakを使えば、別の処理が可能ですが、複数のcase文で共通の処理を実行させることも可能です。
case文毎の別の処理を実行するswitch文の例
1 2 3 4 5 6 7 8 |
switch( $key ) { case 1: echo "case 1\n"; break; case 2: echo "case 2\n"; break; } |
複数のcase文で共通の処理を実行するswitch文の例
1 2 3 4 5 6 7 8 9 10 11 12 |
switch( $key ) { case 2: case 4: case 6: echo "Even Number\n"; break; case 1: case 3: case 5: echo "Odd Number\n"; break; } |
break文でネストしたループ構造を抜ける方法とは
先ほど、break文は引数が指定できて、ネストしたループ構造を抜ける数を指定できると解説しました。しかし、ネストしたループ構造と言われても、よく解らない、という方がいるでしょう。そこで、次からbreak文の対象となるネストしたループ構造について解説します。
繰り返し処理は重複できる
while文やfor文などの繰り返し処理は、プログラムの中でよく使われます。また、配列の要素を順に処理するforeach文も繰り返し処理の一種です。そして、そのような繰り返し処理は、入れ子にして重複して処理できます。
for文を2重にしたPHPのプログラムの例
1 2 3 4 5 6 |
$ans = 0; for( $a=0; $a<10; $a++ ) { for( $b=0; $b<10; $b++ ) { $ans = $ans + $a * 10 + $b; } } |
この例では、$aを0から9まで繰り返すfor文の中に、$bを0から9まで繰り返すfor文を記述した、2重の繰り返し処理の例です。つまり、$aのループと$bのループの2つが重複して書かれています。
ネストとは何か
ネストとは、英語のnestのことで、あるものの中に、それと同じ形や種類のものが入っている状態や構造のことを言います。特にIT用語のネストは、if文の中に別の条件のif文が入った構造や、while文やfor文などの繰り返し処理が複数入れ子になった構造を指す言葉です。
例えば、先ほどの$aのループと$bのループの2つ使った例が、ネストされたループです。そして、$bのループを抜けることを、ネストを1つ抜ける、と言いいます。同じように、$aのループと$bのループの2つのループを同時に抜ける際は、ネストを2つ抜けると言います。
つまり、先ほどの例の$bのループに、ネストを2つ抜けるbreak文を追加すること、$aのループからも抜けられるプログラムの記述が可能です。
ネストしたループ構造を抜ける例
for文を2重のループで、ネスト2つ分を抜けるPHPのプログラムの例を次に紹介します。
1 2 3 4 5 6 7 |
$ans = 0; for( $a=0; $a<10; $a++ ) { for( $b=0; $b<10; $b++ ) { $ans = $ans + $a * 10 + $b; if( $ans > 100 ) break 2; } } |
この例では、先ほどの例に、if文で、「break 2」を追加しました。これにより、if文の条件に一致した場合に、$bのループと$aのループの2つのネストから抜ける、プログラムに変化しています。
breakの引数に変数を指定できない
PHPで使われるほとんどの関数は、その引数に変数を指定できます。しかし、break文の引数に、変数を指定することはできません。例えば、先ほどの例の「break 2」を、変数を使って書き換えることはできません。
breakの引数に変数を使った誤った例
1 |
if( $ans > 100 ) break $nest; |
この場合、breakの引数に整数以外が指定されたため、エラーになります。必ず整数を指定してください。
break文による中断はreturn文でも書ける
先ほど、break文に引数を指定することで、複数のネストを抜けられると解説しました。PHPでは、先ほど解説したように、break文を使うことで、幾つものループをまとめて抜ける処理を記述できます。
しかし、複数のループを持つ複雑なプログラムは、後で修正する際にトラブルになりやすいので、現実のプログラミングではそれほど使われません。
むしろ、ループを持つ処理の一部を関数にして、return文でループを抜ける処理がよく使われます。ループ処理をbreak文で抜けるか、return文で抜けるかは、どのような処理を中断するかにもよりますが、returnでも同じように、ネストを抜けられることを覚えておいてください。
break文で中断する例
1 2 3 4 5 |
$i=0; while(true) { $i+=1; if( $i == 5 ) break; } |
return文で中断する例
1 2 3 4 5 6 7 |
function loop_break() { $i=0; while(true) { $i+=1; if( $i == 5 ) return; } } |
まとめ
これまで解説したように、PHPでは、breakを繰り返し処理の中断や、switch文におけるcase後の処理の中断に使います。また、繰り返し処理では、引数にネストしたループ構造を抜ける数を、整数で指定することも可能です。特に、繰り返し処理では、よく使われる機能の1つなので、ぜひ、使い方を覚えてください。
なお、PHPのbreak文は、複数の繰り返し処理を一度に中断できるので、使い方によっては便利だと思えるかもしれません。しかし、ループが重複したプログラムは構造が複雑で、後から見直す際にトラブルの原因になります。機能によっては、break文で中断するのではなく、関数にしてreturnで中断する方法も使えるようになりましょう。