複数の並列条件で、なおかつ等しいかどうか(演算子でいえば==)の比較であれば、switch文を使えます。先の例では大小の比較がありましたので、この場合はswitch文は使えません。
まず、基本的なswitchの使い方を見てみましょう。
<?php $foo = rand(1, 10); switch($foo) { case 1: print("優です<br>"); break; case 2: print("良です<br>"); break; case 3: print("可です<br>"); break; default: print("不可です<br>"); break; } print("fooの値は{$foo}でした");
今回も1〜10の乱数を発生させていますので、実行結果は、fooの値に応じて変わってきます。ここでは1つ例を挙げておきます。
良です fooの値は2でした
では、switch文の使い方を解説します。switchに続く( )内が比較対象の変数です。波かっこ内に比較する値と実行したい文の両方を記述します。比較する値は、caseに続けて記述し、コロン(:)で終えます。例では数値ですが、文字列でも構いません。
まとめると、以下のような構文になります。
switch(比較対象) {
case 値1:
比較対象が値1のときに行う処理
break;
case 値2:
比較対象が値2のときに行う処理
break;
…
default:
上記以外のときに行う処理
break;
}
caseの後ですが、さらにインデントして実行したい文を記述します。例ではprintの一文だけですが、もちろん複数の文を記述して構いません。そして、文の最後に「break」文を置きます(breakに関しては後述します)。
なお、リスト6のswitch部分は、次のif文を使った記述とまったく同じです。
if($foo == 1) { print("優です<br>"); } elseif($foo == 2) { print("良です<br>"); } elseif($foo == 3) { print("可です<br>"); } else { print("不可です<br>"); }
行数的にはif文を使った方が短いですが、比較する値が「case」によりそろえられていて、見やすくなっています。
なお、switch文の比較は「==」と同一なので、前述の自動的な型変換も行われることを念頭に置いておく必要があります。
defaultは、ifでいうelseに相当するもので、caseに何も一致しなかった場合に実行されます。文法的には最後に置く必要はありませんが、わざわざ最後以外に持っていっても読みにくいだけなので、最後に置きます。
switchでは各条件で実行する文の最後にbreak文を置きますが、この文の意味は「終わり」という意味ではありません。「ここでswitchから(波かっこから)脱出する」という内容の命令です。
もし、次のようにbreakを使わずに記述したとします。これは文法的にはエラーではありませんし、実行もできます。
<?php $foo = rand(1, 10); switch($foo) { case 1: print("優です<br>"); case 2: print("良です<br>"); case 3: print("可です<br>"); default: print("不可です<br>"); } print("fooの値は{$foo}でした");
以下が実行結果例です。
良です 可です 不可です fooの値は2でした
この場合、fooの値が2の場合を記載していますが、「case 2」以降の全ての文が実行されています。breakは「switchから抜ける」という意味でした。つまり、breakが無いとswitchから抜けず、実行を継続するようになります。caseについても「一致していたらここから実行する」という目印のようなもので、それぞれの条件で実行する文が分離しているわけではないのです。
つまり、これは「switch内部の文は、実は一かたまりであり、その途中の至る箇所にcaseやdefaultによって実行開始するポイントがマークされている」というように理解できます。従って、次のような書き方も可能です。
<?php $foo = rand(1, 12); switch($foo) { case 3: case 4: case 5: print("春です<br>"); break; case 6: print("梅雨です<br>"); break; case 7: case 8: case 9: print("夏です<br>"); break; case 10: case 11: print("秋です<br>"); break; case 12: case 1: case 2: print("冬です<br>"); break; default: print("表示されたらおかしいです<br>"); break; } print("fooの値は{$foo}でした");
これは、1〜12の乱数を発生させ、その値に応じて春夏秋冬、および梅雨を表示するプログラムです。実行結果例は以下の通りです。
梅雨です fooの値は6でした
これで複数の値のいずれかに一致した場合、という条件が実現できます。これ以外の用途でbreakを使わないというケースは、共通の処理を書きたい場合ですが、そう多くはありません。現実にはbreakが存在しないというのは誤読の原因になりますので、上記例以外でbreakを使わない場合、コメントで説明を残しておくといいでしょう。
次回は、また変数や型に関するテーマを戻し、「配列」について取り扱います。お楽しみに。
【2014/4/7】初版公開(山口晴広,株式会社イメージズ・アンド・ワーズ)。
【2017/5/8】PHP 7.1含め2017年の情報に合うように更新(齊藤新三/山田祥寛(監修),WINGSプロジェクト)。
Copyright © ITmedia, Inc. All Rights Reserved.