roomx.jp

Room No.1

PHP

switch文による条件分岐

2012.08.29

条件分岐は、圧倒的に if~elseif~ else文を使う事が多いのですが、switch文を使うと条件分岐をより抽象化できる気がします。

変数の単純な値(文字列を含む)の比較を複数回実行し、条件に応じて異なる処理を実行する場合などはif文より使い易く、コードの可読性も上がるのでデバッグが楽になると思います。

と、判っていても…自分はswitch文の使用頻度が低いので、スグに構文を忘れてしまいます。(^^;

つい、使い慣れたif~elseif~ else文でダラダラと冗長なコードを書いて、デバッグの段階で反省の毎日…orz

なので備忘録を兼ねて簡単な占い(?)のスクリプトを書いてみました…。
mt_rand関数で1~8のランダムな数字を発生させ、変数 $str に代入し、サンプル1のif文とサンプル2のswitch文で、双方同じ処理(条件判定)を行っています。

◆PHPマニュアル
switch - 条件分岐
mt_rand - よりよい乱数値を生成する

Sample.1 - sample_switch_1.php
<!DOCTYPE html>
<html>
<head> <meta charset="UTF-8"> <title>PHP:switch Sample.1</title> </head> <body> <h2>今日のアナタの運勢は… <?php $str = mt_rand(1, 8); if( $str == 1 ){ echo "【☆】とても私のクチからは…元気出して下さい…゚・(つД`)・゚・"; }elseif( $str == 2 ){ echo "【☆☆】やる事なす事、すべて裏目に出るでしょう…( ̄□ ̄||| "; }elseif( $str == 3 ){ echo "【☆☆☆】ドンマイ!明日があるさ…(;´Д`)"; }elseif( $str == 4 ){ echo "【☆☆☆☆】まあまあやね…(´・ω・`)"; }elseif( $str == 5 ){ echo "【☆☆☆☆☆】ふんッ!いつも幸運だとは限らないからなっ!( ̄へ ̄)ノ"; }elseif( $str == 6 ){ echo "【☆☆☆☆☆☆】ハッピーな一日になるでしょうネ…多分( ̄ー ̄)ニヤリッ"; }elseif( $str == 7 ){ echo "【☆☆☆☆☆☆☆】無敵モードです!(`・ω・´) キリッ"; }else{ echo "【☆☆☆☆☆☆☆☆】ほほう…(*´▽`*)"; } ?> </h2> </body> </html>

普通にif文で条件分岐。

 

Sample.2 - sample_switch_2.php
<!DOCTYPE html>
<html>
<head> <meta charset="UTF-8"> <title>PHP:switch Sample.2</title> </head> <body> <h2>今日のアナタの運勢は… <?php $str = mt_rand(1, 8); switch( $str ){ case 1; echo "【☆】とても私のクチからは…元気出して下さい…゚・(つД`)・゚・"; break; case 2: echo "【☆☆】やる事なす事、すべて裏目に出るでしょう…( ̄□ ̄||| "; break; case 3: echo "【☆☆☆】ドンマイ!明日があるさ…(;´Д`)"; break; case 4: echo "【☆☆☆☆】まあまあやね…(´・ω・`)"; break; case 5: echo "【☆☆☆☆☆】ふんッ!いつも幸運だとは限らないからなっ!( ̄へ ̄)ノ"; break; case 6: echo "【☆☆☆☆☆☆】ハッピーな一日になるでしょうネ…多分( ̄ー ̄)ニヤリッ"; break; case 7: echo "【☆☆☆☆☆☆☆】無敵モードです!(`・ω・´) キリッ"; break; default; echo "【☆☆☆☆☆☆☆☆】ほほう…(*´▽`*)"; } ?> </h2> </body> </html>

switch文で条件分岐。

case の行末はコロン(:)、セミコロン(;)のどちらでもOKですが、1つのスクリプト内では統一するのが基本ですね…。
ちなみに自分はコロンよりセミコロンの方が好みです。

switch文で break を書き忘れると全ての処理が実行されてしまいます。(コレをいつも忘れてしまう…)

どのケースにもマッチしない場合は default を使って条件分岐させますが、上のサンプルで default を使うのは…(ーー;)
サンプルでは、必ず1~8の数字が変数 $str に入るので、本来は 【case 8;】として処理すべきですし、自分の場合 switch文は条件判定が明確な場合に使う事が多いので default を使う場面が今一つピンと来ません。(何れかのケースに必ずマッチするならば default は不要)

▲BACK TO TOP