Back to Top
Room A
WEB - PHP
  • Twitter
  • Facebook
  • Pinterest
  • Hatena
  • instagram
  • YouTube

switch文による条件分岐

2012.08.29

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

switch 文

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

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

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

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

PHP.net 公式マニュアル

  • switch - 条件分岐
  • mt_rand - よりよい乱数値を生成する

if ~ else if ~ else で条件分岐

sample_switch_1.php : Sample Code

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>PHP:switch Sample.1</title>
</head>
<body>
<h2>今日のアナタの運勢は…

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

</h2>
</body>
</html>

普通にif文で条件分岐させると、個人的に見慣れたダラダラコードが出来上がりました...(´Д` )

switch 文で条件分岐

sample_switch_2.php : Sample Code

<!DOCTYPE html>
<html lang="ja">
<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 を使う場面が今一つピンと来ません。(何れかのケースに100%マッチするならば default は不要)

switch文に於ける default は、何れのケースにも当て嵌まらない場合の処理、例えばエラーなど、想定外のケース(条件)が発生した場合の処理か、逆に圧倒的多数の条件に対応する処理が記述されているコードを多く見かけます。