【PHP】switch文(条件分岐) – 使い方やif文との違いについて解説

プログラムで条件分岐する方法はif文とswitch文の2種類あります。
条件分岐するとき、学習では初めにif文を学ぶことが多いためか、if文が比較的多く使われる傾向にあります。

しかし、状況によって、if文よりもswtich文の利用の方が好ましいことがあります。

ここでは、swtich文の使い方とif文との違いについて解説します。
なお、if文については次の関連記事で解説しておりますのでご覧ください。

★ 目的

  • switch文を使えるようになる。
  • if文とswitch文の違いを理解する。

switch文の構文

switch文の構文は次になります。

switch( 条件値 ) {
    case 条件式1 :
        // 条件式1が真の場合はここから処理を実行
        // 処理・・・・
        break;
    case 条件式2 :
        // 条件式2が真の場合はここから処理を実行
        // 処理・・・・
        break;
    case 条件式3 :
        // 条件式3が真の場合はここから処理を実行
        // 処理・・・・
        break;
    default :
        // 上記のいずれの条件式も真でない場合はここから処理を実行
        // 処理・・・・
}

switch文の使用例

switch文は条件式の内容がデータの場合と論理式の場合で動作が変わります。

それぞれサンプルコードで確認してみましょう。

① 条件式がデータの場合

学校の教科によって先生の名前を出力するプログラムを例に見ていきましょう。

ソースコード

<?php

// 教科
$subject = '英語';
echo $subject.'は';
// 教科の先生の名前を出力
switch($subject) {
    case '国語' :
        echo "国木田先生です。\n";
        break;
    case '数学' :
        echo "松浦先生です。\n";
        break;
    case '英語' :
        echo "小原先生です。\n";
        break;
    case '理科' :
        echo "津島先生です。\n";
        break;
    case '社会' :
        echo "黒澤先生です。\n";
        break;
    default :
        echo "先生がいません。\n";
}

?>

実行結果

英語は小原先生です。

switch文の処理の流れは、上から順に条件式の真偽を判定し、真の場合、そのcaseの処理を実行します。

このとき、条件式がデータ(文字列や数値)の場合、『条件値とデータが等しいか』という観点で真偽を判定します。

上記例では$subjectのデータは『英語』なので3つ目のcase文の条件式が真になり、「小原先生です」と出力されます。

なお、いずれの条件式も真ではない場合はdefaultの処理が実行されます。if文でいうelse文と同じ役割持つイメージです。

また、breakはブロックを制御する記述です。後ほど説明しますが、breakが実行されるとブロック(括弧{})の処理を終了すると覚えておきましょう。

② 条件式が論理式の場合

テストの点数別の評価を出力するプログラムを例に見ていきましょう。

ソースコード

<?php

// 教科
$score = 88;
echo $score.'点は';
// 教科の先生の名前を出力
switch($score) {
    case $score > 90 :
        echo "S評価\n";
        break;
    case $score > 80 :
        echo "A評価\n";
        break;
    case $score > 60 :
        echo "B評価\n";
        break;
    case $score > 30 :
        echo "C評価\n";
        break;
    case $score > 0 :
        echo "D評価\n";
        break;
    default :
        echo "評価できません。\n";
}

?>

実行結果

88点はA評価

条件式が論理式の場合は、その演算結果が真の場合にcaseの処理を実行します。

ここでは、$scoreが88なので、2つ目の条件式が真になり、「A評価」と出力されています。

ただ、条件式が論理式の場合は、if文を使用した方が早く分かりやすく記述できることもあり、このswitch文の使い方はあまりおすすめしません。

breakについて

構文や例で登場したbreakについて説明します。

breakはブロック制御に使用する記述です。

ブロックとは繰り返し処理や条件分岐で使用する括弧 {} ←のことです。

breakが実行されるとbreakから一番近い括弧{}から抜け出して次の処理へ移ります。

イメージしやすいよう、先ず上記例でbreakを全て消したパターンで見てみましょう。

ソースコード

<?php

// 教科
$subject = '英語';
echo $subject.'は';
// 教科の先生の名前を出力
switch($subject) {
    case '国語' :
        echo "国木田先生です。\n";
    case '数学' :
        echo "松浦先生です。\n";
    case '英語' :
        echo "小原先生です。\n";
    case '理科' :
        echo "津島先生です。\n";
    case '社会' :
        echo "黒澤先生です。\n";
    default :
        echo "先生がいません。\n";
}

?>

実行結果

英語は小原先生です。
津島先生です。
黒澤先生です。
先生がいません。

「英語は小原先生です。」と出力される部分は同じですが、それより下のcaseとdefaultの処理も実行されています。

switchは1度条件式が真になりcaseの処理を実行すると、それ以下のcaseは条件式の真偽値に関わらず処理を実行するという動きをします。

この特性を活かしたコードを書くこともできますが、ただうっかりbreakを忘れた場合、エラーの原因になりますので注意しましょう。

ifとswitchの違い

ifとswitchは基本的には同じ動作をするため、ソースコードではifが使われることが多く、switchはあまり登場しません。

しかし、『1データに対して複数の値で条件を分岐させたい』場合はswitchを使用した方が、早く綺麗にコードを記述することができます。

ifとswitchの違いを理解するため、if文で書いた『① 条件式がデータの場合』のプログラムを比較しながら見ていきましょう。

ソースコード

<?php

// 教科
$subject = '英語';
echo $subject.'は';
// 教科の先生の名前を出力
if( $subject == '国語' ) {
    echo "国木田先生です。\n";
} else if( $subject == '数学' ) {
    echo "松浦先生です。\n";
} else if( $subject == '英語' ) {
    echo "小原先生です。\n";
} else if( $subject == '理科' ) {
    echo "津島先生です。\n";
} else if( $subject == '社会' ) {
    echo "黒澤先生です。\n";
} else {
    echo "先生がいません。\n";
}

?>

各条件式で『$subject ==』を記述しており、switchに比べると少し冗長して手間になります。また、もし$subjectの変数名が変わった場合、switchは条件値の部分を変えるだけで良いですが、ifの場合はそれぞれ変更する必要があります。

このようにswitchを使用した方が記述量が少なく、分かりやすいコードが書けることがあります。

また、switchの方が処理速度が速いこともあるので、プログラムに応じて使い分けましょう。

まとめ

switchの使い方とifとの違いについて解説しました。

条件分岐は基本的にはifで良いかと思いますが、場合によってはswitchを使いましょう。