PHP

第8章 switch文

  1. 最終更新日:
  2. 公開日:

この章では、1つの値を複数の条件で判定するときに便利な「switch文」を学びます。if文と同じ条件分岐をするための基本構文です。

基本的な使い方

switch文の基本的な形は図1のようになります。

図1:

switch文の基本的な形

まず、switch()に判定したい値を渡します。
すると、その値をswitch文{}内にあるcaseの値で該当するものがあるか上から順に確認していきます。

もし該当する値を持ったcaseを見つけたら、その中に書かれている「実行する処理」を実行し、break;switch文を終了します。
該当する値のcaseがない場合は、defaultの中の処理を実行します。
if文でいう「else」みたいな位置づけですね。

上から順に実行するところや、defaultの動作からして、if文elseifelseを組み合わせたコードとよく似ています。
実際の動きを確認するために、今回は曜日の判定を例にしたコードを打っていきましょう。

PHP コード例

<?php
// タイムゾーンを指定します
date_default_timezone_set('Asia/Tokyo');

// 今日が何曜日か取得します
// 0:日 1:月 2:火 3:水 4:木 5:金 6:土
$week = date('w');

switch( $week ) {
  case 0:
    echo "今日は日曜日!";
    break;
  case 1:
    echo "今日は月曜日";
    break;
  case 2:
    echo "今日は火曜日";
    break;
  case 3:
    echo "今日は水曜日";
    break;
  case 4:
    echo "今日は木曜日";
    break;
  case 5:
    echo "今日は金曜日";
    break;
  default:
    echo "今日は土曜日";
}

ちょっと縦に長くなってしまいましたが、if文を知っていたら動作も直感的に分かるかもしれません。
上からコードを分解して見ていきましょう。

まずはswitch文とは直接関係ありませんが、3行目のdate_default_timezone_set関数です。
これはサーバーの日付を「東京」時間に設定しています。
ローカルで実行している場合はあまり関係ないかもしれませんが、本運用時にサーバーを借りると、サーバー自体が海外にあるケースがあったり、時間の設定が海外になっていることがあります。
そのため、コードの冒頭などで時間設定を指定しておくと確実です。

7行目のdate('w')は、実行した時点の「週」を取得して$weekへ代入します。
date関数は引数によって、「年月日」「時分秒」「月」など様々な形の時間を取得することができます。
非常に便利な関数なので、今後も頻繁に使用すると思います。

今回は引数に「w(小文字のw)」を渡しているので、「週」を数値で返してくれます。
コメントアウトの通り「0」は「日曜」に対応していて、順に「1」は月曜〜「6」は土曜となっているので、必ず06の範囲で数値を返してくれます。

そして、取得した週の値を9行目でswitch文に渡して該当するcaseを探します。

caseの中に毎回書いているbreakは、switch文にとって重要な役目を担っています。
これが書かれていない場合、該当するcase内の処理が終わってもswitch文から抜けずに、さらに下にあるcasedefaultの処理まで実行してしまいます。

ここまでで基本的なswitch文の流れを見てきましたが、if文との使い分けは「式」を評価するか、「値」を評価するかで判断します。
if文では決まった比較演算子などを使って「式」を評価するときに便利ですが、特定の変数に入っている「値」を判定したいときはswitch文の方が得意です。

とても重要な「break」

試しに、breakを書かなかった場合の処理を見てみましょう。
先ほどのコードを次のように修正して実行してみてください。

※実行した日が土曜日の場合、修正前と実行結果が変わりません。
その場合は、switch文に値を渡す$weekを、数値の「0」や「3」に置き換えてみてください。

PHP コード例

<?php
// タイムゾーンを指定します
date_default_timezone_set('Asia/Tokyo');

// 今日が何曜日か取得します
// 0:日 1:月 2:火 3:水 4:木 5:金 6:土
$week = date('w');

switch( $week ) {
  case 0:
    echo "今日は日曜日!";
    //break;
  case 1:
    echo "今日は月曜日";
    //break;
  case 2:
    echo "今日は火曜日";
    //break;
  case 3:
    echo "今日は水曜日";
    //break;
  case 4:
    echo "今日は木曜日";
    //break;
  case 5:
    echo "今日は金曜日";
    //break;
  default:
    echo "今日は土曜日";
}

出力される結果がおかしいことに気づかれたでしょうか。
breakが無くなった途端、本来該当しないはずの曜日まで出力されてしまうようになりました。
これを防ぐためにbreakでswitch文を制御します。

応用した書き方

もちろん、上記の特性を活かしてbreakをあえて書かない場合もあります。
例えば「週末」と「平日」を分けたい場合のコードは次のようになります。

PHP コード例

<?php
date_default_timezone_set('Asia/Tokyo');
$week = date('w');

switch( $week ) {
  case 0:
  default:
    echo "週末!";
    break;
  case 1:
  case 2:
  case 3:
  case 4:
  case 5:
    echo "平日";
}

このようにbreakを書かないで、いくつかのcaseの処理をまとめてしまうこともできます。コードがシンプルになりましたね。
また、defaultも好きな位置に置くことができるので、上のようにcaseの間にあっても大丈夫ですし、不要であれば書かなくても結構です。

まとめ

switch文の使い方はバッチリでしょうか。
if文でも複数の「elseif」を使えばswitch文と同じような処理を書くこともできますが、「式」ではなく「値」の判定であればswitch文を使った方が高速に動作します。
また、式もシンプルになり後でコードを読み直すときにも分かりやすくなります。
なので、使えるときはswitch文を活用していきましょう。

この章で学んだこと

  • 特定の「値」を判定するときはswitch文を使うことができる
  • caseの中にはbreakも忘れずに書く
  • 複数のcaseをまとめるなど、必要に応じてbreakを書かないこともできる
  • どのcaseにも該当しないときの処理はdefaultに書く
  • casedefaultの書く順番は自由にすることができる

記事一覧

  1. 第1章 PHPが動く仕組み
  2. 第2章 変数と定数
  3. 第3章 配列
  4. 第4章 スーパーグローバル
  5. 第5章 クッキーとセッション
  6. 第6章 サーバー情報の取得
  7. 第7章 if文
  8. 第8章 switch文
  9. 第9章 while文
  10. 第10章 for文
  11. 第11章 foreach文
  12. 第12章 独自の関数
  13. 第13章 オブジェクト指向
  14. 第14章 クラス
  15. 第15章 オブジェクト

記事一覧