PHP 入門 | 制御構文 | switch 文による複数分岐

if は二者択一(truefalse)の分岐だが、ときにはもっと多くの処理に分岐したい場合がある。もちろん 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: を探してそこへジャンプするということである。

ただし、ここで忘れてはいけないのは「switchcase にジャンプするだけで、戻ったり必要な構文を終了したりする機能はない」ということである。つまり、そのまま上から下へ実行されるだけである。したがって、必要な処理を終えたら構文から抜ける必要がある。

そのために用意されているのが 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 で書こうとすると、多くの ifelseif 文を書く必要がある。これは 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 なので、BC が表示される。これは case 2: の処理の中に break; 文がないため、B を表示したあと続けて case 3: にある C も表示するためである。