ITHACK
~ みんなのIT部門 ~

【PHP】switch文(条件分岐) – 変数の値による分岐

条件分岐する方法はif文とswitch文の2通りあります。
if文が使われることが比較的多くありますが、状況によってはswitch文の方が適切なことがあります。

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

  • switch文

  • if文とswitch文の違い

switch文とは

switch文は条件で分岐するための仕組みです。
変数の値によって条件を分岐することができます。

基本構文

switch文の基本構文は次のようになります。

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

サンプルコード

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の条件式を上から順に判定し、真の場合にそのcaseを実行します。
条件式が値(リテラル)の場合は条件値(ここでは$subject)と『等しいか』を判定します。

サンプルコードでは$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がないパターンで確認してみましょう。

<?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で処理を制御します。

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

if文とswitch文の違い

if文とswitch文は条件分岐という意味では同じ処理を実現できます。
一般的にはif文が使われることが多く、switchは比較的使われることがありません。

しかし、『1つの変数の値によって、処理を分岐したい』場合は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 ==があり、少し冗長的です。
また、$subjectの変数名が変わった場合、switch文は条件値の変数名を修正するだけですが、if文の場合は全ての条件式を修正する必要があります。

このようにswitchを使った方が記述量が少なく、分かりやすいコードが書けることがあります。
※ switch文の方が処理速度が速いこともあります。

演習問題

問題1

月(数字)の英語名を出力するプログラムを作成してください。
なお、下記の条件を満たすものとします。

  • 条件分岐はswitch文を使用する
  • 月(数字)はコマンドライン引数で与える
$ php practice.php 8 
8月は英語でAugustです。
$ php practice.php 13
13月は英語で----です。

問題2

お会計の合計金額に会員ランクによって割引を適用するプログラムを作成してください。
なお、下記条件を満たすものとします。

  • 合計金額は『単価×個数』で計算する
  • 単価、個数、会員ランクはコマンドライン引数で与える(単価、個数、会員ランクの順)
  • 会員ランクはGold、Silver、Bronze、Normalの3種類
  • 割引の条件
    Gold 20%OFF
    Silver 10%OFF
    Bronze 5%OFF
    Normal なし
  • 条件分岐はswitch文を使用する
$ php practice.php 1350 7 Gold
割引率           : 20%
割引金額         : 1890円
合計金額(割引前) : 9450円
合計金額(割引後) : 7560円
$ php practice.php 1350 7 Silver
割引率           : 10%
割引金額         : 945円
合計金額(割引前) : 9450円
合計金額(割引後) : 8505円
$ php practice.php 1350 7 Normal
割引率           : 0%
割引金額         : 0円
合計金額(割引前) : 9450円
合計金額(割引後) : 9450円

まとめ

switch文は条件で処理を分岐する仕組みです。
if文とswitch文の違いを理解して、適宜使い分けていきましょう。