switch
そふぃのPHP入門 >> PHP言語リファレンス >> PHPの制御構造 >> switch

switch

switch文

switch文は同じ条件式を用いたif文をいくつか並べたものと似たような働きをします。

if-elseif-elseでは複数の条件を上から順番にチェックして、最初に条件が成立したブロックの処理をさせる(条件が成立しなかった場合はelseブロック)構造ですが、1つの変数をこのようにチェックする場合にswitch文を使う事ができます。

基本の構文

switch文の括弧「()」内に条件判定させる変数や式を記述し、case式で判定する値を記述します。各case式はコロン「:」で区切ります。

(変数や式)の部分が値1であれば処理1を値2であれば処理2を実行し、どの値でもなければデフォルトの処理を実行します。条件判定させる事ができるのは変数か式で、その判定対象を各case式に書かれた値に等しいかどうか上から順番に判定し、条件が成立すればそのcase式以降の処理を「break」もしくはブロックの終了まで実行します。

defaultはcase文の特別な場合で、これは他の全てのcase式の条件に当てはまらない時に実行される処理で、最後のcase文の後におく必要があります。if文でのelseみたいなもんですね。

switch文使用方法

  1. switch( 変数や式 ){
  2.   case1:
  3.   処理1;
  4.       break;
  5.   case2:
  6.   処理2;
  7.       break;
  8.   default:
  9.   デフォルトの処理
  10. }

if文で記述した場合

  1. <?php
  2. $a = 2;
  3. if( $a == 0 ){
  4.   echo '$aは0です。';
  5. }
  6. else if( $a == 1 ){
  7.   echo '$aは1です。';
  8. }
  9. else if( $a == 2 ){
  10.   echo '$aは2です。';
  11. }
  12. else{
  13.   echo '$aは0・1・2のいずれでもありません。';
  14. }
  15. ?>

出力結果

$aは2です。

if文で書くとこのようになる処理が、switch文で書くと以下のようになります。

  1. <?php
  2. $a = 2;
  3. switch( $a ){
  4.   case 0:
  5.       echo '$aは0です。';
  6.       break;
  7.   case 1:
  8.       echo '$aは1です。';
  9.       break;
  10.   case 2:
  11.       echo '$aは2です。';
  12.       break;
  13.   default:
  14.       echo '$aは0・1・2のいずれでもありません。';
  15. }
  16. ?>

出力結果

$aは2です。

このサンプルでは括弧「()」内にある変数$aの値を一番上のcase式に書かれた値から順番に比べていき、値が一致したブロックの処理を行います。実際に実行してみると以下のようになります。

break文の働き

switch文の中で使うbreakには現在のswitch構造を抜ける(実行を終了する)という働きがあります。

if文ではifelseifが出てくるたびに条件を判定して実行していますが、switch文では条件の判定は最初に1度だけ行い、その条件式の値と一致するcase文が見つかった時に始めて実行されます。その後はブロックの終わりかbreakが出てくるまで処理を実行しつづけます。

ここで重要なのは、条件式と一致するcase文が見つかったらbreak(かブロックの終わり)まで処理を実行しつづけるってトコです。つまり、break文を入れないと条件が成立したcase文以降のcaseも実行しちまいます。

break文のない構文

  1. <?php
  2. $i = 1;
  3. switch ( $i ) {
  4.   case 0:
  5.       echo '$iは0';
  6.   case 1:
  7.       echo '$iは1';
  8.   case 2:
  9.       echo '$iは2';
  10. }
  11. ?>

出力結果

$iは1$iは2

switch文はこのように「条件が成立したcase文以降break(もしくはブロックの終わり)が出てくるまで」処理を実行してしまいますが、break文を必ずしも入れなくてはならない訳ではありません。

例えば違った値を持つけれども共通の処理をさせたい場合などにはbreak文を書かず、case文を並べておく事もできます。

サンプル:複数のcaseを並べた構文

  1. <?php
  2. $food = "apple";
  3.  
  4. switch( $food ){
  5.   case "apple":
  6.   case "banana":
  7.   case "grape":
  8.       //$foodがapple,banana,grapeだった時の共通処理
  9.       echo '$foodは果物です';
  10.       break;
  11.   case "onion":
  12.   case "carrot":
  13.       //$foodがonion,carrotだった時の共通処理
  14.       echo '$foodは野菜です';
  15.       break;
  16.   default:
  17.       echo '$foodが野菜か果物か不明です';
  18. }
  19. ?>

出力結果

$foodは果物です

case式の型

case式は、スカラー型(整数型・浮動小数点型・文字列型)に式を評価する任意の式が使用できます。配列またはオブジェクトは単純な型にキャストされていない限り使用する事ができません。