break continue goto文の使いどころ

break文

break文はループ処理やswitch文を中止する時に使います。引数に整数を指定すると、その数値に対応する、入れ子にされた数のループ構造中から抜け出します。

PHP
1
2
3
4
5
6
7
8
9
10
11
<?php
// break文
$a=array('jQuery','PHP','css');
foreach($a as $key => $val){
if($val=='PHP'){
echo '「PHPを取得」';
break;
}
echo '「'.$val.'」';
}
?>
実行結果:「jQuery」「PHPを取得」

foreachは配列の中身(要素)を順番に取り出して処理し、無くなると処理を終了します。上記では配列の一番目である「jQuery」要素はそのままechoされます。二番目の「PHP」要素はif文でキャッチされて「PHPを取得」とechoし、次にbreak文でforeachの処理を中止します。三番目の「css」要素は二番目で処理を中止されたため、どこにもechoされません。

PHP
1
2
3
4
5
6
7
8
9
10
11
12
<?php
// break文
$a="php";
switch($a){
case 'jquery':
echo "「jQuery」です。";break;
case 'php':
echo "「php」です。";break;
case 'css':
echo "「css」です。";break;
}
?>
実行結果:「php」です。

$aに「php」を指定しているため、上から二つ目の「case」にキャッチされて、”「php」です。”とechoし、次のbreak文によってswitch文の処理を終了しています。

continue文

continue文はループ処理の途中で次のループ処理をさせる場合に使います。引数に整数を指定すると、その数値に応じた数の入れ子になったループ構造の終了地点までスキップし、次のループへと処理が移ります。ループ内にswitch文が存在するケースで、continue 2を指定した場合、外側のループの次の処理から継続します。

PHP
1
2
3
4
5
6
7
8
9
10
<?php
// continue
$a=array(1,2,3,4,5);
foreach($a as $key => $val){
if(!($val % 2)){
continue;
}
echo '「奇数'.$val.'」';
}
?>
実行結果:「奇数1」「奇数3」「奇数5」

5行目は配列要素を2で割っていった余りが1か0なのかを判定しています。if文に論理否定演算子を使っているので、「1ではない」という意味になり、「0であれば」continueという処理になります。つまり、余りがなく、綺麗に割り切れてしまった値は偶数ということになり、偶数であれば処理が飛ばされ、奇数だけがechoされるという仕組みです。尚、剰余演算子(%)は、両方の値を整数に直してから使います。浮動小数点の剰余を求めるにはfmod()を使います。

PHP
1
2
3
4
5
6
7
8
9
10
11
12
<?php
// continue
$a="php";
switch($a){
case 'jquery':
echo "「jQuery」です。";continue;
case 'php':
echo "「php」です。";continue;
case 'css':
echo "「css」です。";continue;
}
?>
実行結果:「php」です。

break文の代わりにcontinue文を使った例です。文字が入れ替わっただけです。

goto文

PHP
1
2
3
4
5
6
7
8
9
10
11
12
<?php
// goto文
$a=array('jQuery','PHP','css');
foreach($a as $key => $val){
if($val=="PHP"){
goto check;
}
echo '「'.$val.'」';
}
check:
echo '「goto文で処理を移動した配列要素のPHPです。」';
?>
実行結果:「jQuery」「goto文で処理を移動した配列要素のPHPです。」

一番目の「jQuery」要素は通常通り表示されます。二番目の「PHP」要素はif文でキャッチされて、goto文で指定した「check」のある部分まで処理を飛ばされます。この「check」というのは任意につけられる名前で、ジャンプ先にはこの名前とその直後にコロンをつけて指定します。goto文は無条件に処理を移動させますが、関数やメソッド、ループ中(while文、for文、foreach文)、switch文の中に処理を飛ばすことはできません。また、同じファイル上でなければなりません。反対にループ中やswitch文からは抜け出すことができます。