PHP 入門 | 制御構文 | switch 文による複数分岐
if は二者択一(true、false)の分岐だが、ときにはもっと多くの処理に分岐したい場合がある。もちろん elseif を使えば if 文でも多くの分岐処理は可能だが、長くなるとコードが複雑になる。特に数値などを扱う場合、「結果が 1 ならこれ、2 ならこれ、3 なら ……」というように、値に応じてそれぞれ別の処理をしたいことがある。
このような場合に使用するのが switch という構文である。これは次のような形をしている。
switch (条件) {
case 値1 :
... 値1 の場合の処理 ...
break;
case 値2 :
... 値2 の場合の処理 ...
break;
... 必要なだけ case が続く ...
default :
... どれでもない場合の処理 ...
}
波括弧の代わりにコロンと endswitch を使用することもできる。
switch (値1):
case 値1:
... 値1 の場合の処理 ...
break;
case 値2:
... 値2 の場合の処理 ...
break;
... 必要なだけ case が続く ...
default:
... どれでもない場合の処理 ...
endswitch;
この switch 文も、括弧の条件をチェックして分岐する。ただし、この条件は if のような論理値である必要はない。普通の数値やテキスト値でもかまわない。
switch は括弧の中の条件値を確認し、その値に指定された case へジャンプする機能を持つ。たとえば値が 1 なら、case 1: を探してそこへジャンプするということである。
ただし、ここで忘れてはいけないのは「switch は case にジャンプするだけで、戻ったり必要な構文を終了したりする機能はない」ということである。つまり、そのまま上から下へ実行されるだけである。したがって、必要な処理を終えたら構文から抜ける必要がある。
そのために用意されているのが break という予約語である。これは現在実行中の構文を抜け、次の動作へ進む。各 case に用意した処理の最後には、基本的にこの break を付けると覚えておこう。
もし値と同じ case を見つけられない場合は、最後にある default: に宣言された処理へ移動する。この default は省略できる。その場合、case が見つからなければ何もせずに構文を抜け、そのまま処理を続ける。
switch を使用すると、かなり複雑な分岐も作成できる。簡単な例を見てみよう。
<?php
$b = "A"; // 血液型を書く
?>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=UTF-8" />
<title>sample page</title>
</head>
<body>
<h1>Hello PHP!</h1>
<div>
<?php
switch($b){
case "A":
echo "あなたは几帳面ですね。";
break;
case "B":
echo "あなたは自由奔放ですね。";
break;
case "AB":
echo "あなたは複雑な人ですね。";
break;
case "O":
echo "あなたは大物ですね。";
break;
default:
echo "あなたは人間ではありませんね。";
}
?>
</div>
</body>
</html>
これは血液型によって表示メッセージを変える例である。最初の $b に血液型を入力する。その血液型に応じたメッセージが表示される。
ここでは switch($b) で分岐を用意している。そして case "A": など、各血液型のテキストの case を用意し、そこで echo を実行している。このような分岐の多い処理を if で書こうとすると、多くの if や elseif 文を書く必要がある。これは switch によってかなりすっきり書けるようになった。
case 文に break; がない場合
もう 1 つ例を見てみよう。
<?php
$var = 2;
?>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=UTF-8" />
<title>sample page</title>
</head>
<body>
<h1>Hello PHP!</h1>
<div>
<?php
$var = 2;
switch ($var) {
case 1:
echo "A";
break;
case 2:
echo "B";
case 3:
echo "C";
break;
default:
echo "Z";
}
?>
</div>
</body>
</html>
上の例では $var の値が 2 なので、B と C が表示される。これは case 2: の処理の中に break; 文がないため、B を表示したあと続けて case 3: にある C も表示するためである。