PHPには、条件によってプログラムの処理を分岐するためのswitch文があります。
この記事では、
・switch文の使い方が知りたい
・swich文で複数条件を指定する方法が知りたい
という基本的な内容から、
・switch文で厳密な比較を行う方法が知りたい
・繰り返し処理の中でswitch文を使用したい
・switch文で比較演算子を使用した分岐処理を行いたい
・swich文で処理のスキップや終了する方法が知りたい
などの応用的な方法に関しても解説していきます。
今回はそんなswitch文の使い方について、わかりやすく解説します!
switch文とは
switch文とは、「もし◯◯だったら、△△の処理をする」といった条件ごとに処理を行うための文法です。
if文は主に条件式によって処理を分岐するのに対して、switch文は、ある変数の値によって分岐処理を行うときに主に使用します。
switch文は同じ変数を異なる値と比較し、値によって異なる処理を行います。
以下の例では、変数の値を値1、値2、値3と比較し、一致する値があればそのcase文の処理を行います。
switch文の書き方:
switch (変数) { case 値1: // 変数の値が値1の場合に行う処理 break; case 値2: // 変数の値が値2の場合に行う処理 break; case 値3: // 変数の値が値3の場合に行う処理 break; }
case文にはcaseの後に記述された値と、比較する値が一致した場合にcase文以下の処理が実行されます。
case文の最後にbreakがあれば、switch文の処理を終了します。
case文での比較には、if文同様に変数で文字列を指定することができますし、「case ‘apple’:」のように文字列や値を直接指定することも可能です。
switch文の基本的な使い方
ここでは、switch文の基本的な使い方を解説します。
以下の例では、$valueの値を0、1、2と比較しています。
$valueの値は1ですので、「case 1:」の後の処理が実行されます。
<?php $value = 1; switch ($value) { case 0: echo 'valueは0です'; break; case 1: echo 'valueは1です'; break; case 2: echo 'valueは2です'; break; } ?>
実行結果:
valueは1です
同じ処理を、以下のようにif文を使って書くこともできます。
<?php $value = 1; if ($value == 0) { echo 'valueは0です'; } elseif ($value == 1) { echo 'valueは1です'; } elseif ($value == 2) { echo 'valueは2です'; } ?>
実行結果:
valueは1です
elseifによる複数分岐が増えると、ソースコードの可読性に難がありますので、複数分岐の場合はswitch文で書いたほうが読みやすくなります。
そのため、elseifとswitch文は用途によって使い分けるのが良いでしょう。
defaultの使い方
switch文で、どの条件にもあてはまらない場合に処理を行うには、default文を使用します。
そのため、if文のelseと同じような使い方になります。
以下の例では、$valueの値を0、1、2と比較し、どの条件にもあてはまらない場合にdefault文の処理が実行されます。
$value = 5; switch ($value) { case 0: echo 'valueは0です'; break; case 1: echo 'valueは1です'; break; case 2: echo 'valueは2です'; break; default: echo 'valueは0でも1でも2でもありません'; break; }
実行結果:
valueは0でも1でも2でもありません
default文は複数指定すると、エラーが発生しますので注意しましょう。
複数条件を指定する方法
case文の中でbreakを使わないことで、複数の条件で同じ処理を行うこともできます。
以下の例では、$valueの値が0、1、2の場合に、「case 2:」の後の処理が実行され、breakでswitch文を終了します。
$value = 1; switch ($value) { case 0: case 1: case 2: echo 'valueは0または1または2です'; break; case 3: echo 'valueは3です'; break; }
実行結果:
valueは0または1または2です
switch文は基本的にbreakが見つかるまで処理を順番に実行します。
上記のサンプルプログラムのようにcase文で複数の条件で同じ処理を行いたい場合は、switch文の特性を活かすことで複数条件での実行処理が可能となります。
switch文で厳密な比較を行う方法
switch文での比較は‘==’演算子による緩やかな比較で、’===’演算子のように型の比較までは行いません。
そのため、以下のように比較する変数とcaseに指定する値の型が異なる場合は注意が必要です。
<?php $value = ''; switch ($value) { case 0: echo 'valueは0です'; break; case 1: echo 'valueは1です'; break; case 2: echo 'valueは2です'; break; default: echo 'valueは0でも1でも2でもありません'; break; } ?>
実行結果:
valueは0です
上の例では、$valueに代入された空の文字列を、0、1、2の数値と比較しています。
ここで’==’演算子による比較が行われるため、空文字列は「0」に暗黙的に変換されてしまい、「case 0:」の処理が実行されてしまいます。
型まで考慮した厳密な比較を行うには、以下のようにします。
<?php $value = ''; switch (true) { case $value === 0: echo 'valueは0です'; break; case $value === 1: echo 'valueは1です'; break; case $value === 2: echo 'valueは2です'; break; default: echo 'valueは0でも1でも2でもありません'; break; } ?>
実行結果:
valueは0でも1でも2でもありません
switchの後にはtrueを指定し、caseに‘===’演算子による比較を入れます。
このようにすると、「default:」の処理が実行されます。
switch文とif文の違いとは
複数の条件分岐を行う場合はif~else if文でも可能ですが、switch文との違いは何なのでしょうか?
if文の場合は簡単な条件式を1~2つ書く分には適していますが、「else if」がいくつも連なるとソースコードが見にくくなってしまいます。
switch文の場合は多分岐の処理でも、if文よりもソースコードがすっきりと見やすくなりますので、多分岐処理に向いていると言えます。
そのため、
「if文は1~2つの分岐処理」
「Switch文は2つ以上の分岐処理」
など使い分けるとよいでしょう。
if文についてさらに詳しく知りたい方は、以下の記事を見てみてくださいね!
breakとcontinue
breakを指定しない場合
switch文を終了するには、case文の中でbreakを使います。
しかし、caseの中でbreakを指定しないとどうなるのでしょうか?
以下にbreakを指定しない場合のSwitch文のサンプルを紹介します。
<?php $value = 0; switch ($value) { case 0: echo 'valueは0です<br>'; case 1: echo 'valueは1です<br>'; case 2: echo 'valueは2です<br>'; } ?>
実行結果:
valueは0です valueは1です valueは2です
valueの値は0ですので、「case 0」の条件に一致して「valueは0です」が出力されるまでは良いですが、breakを指定しないと、次のcase文の処理も実行されてしまうことがわかりますね!
そのため、次のcase文も実行させたいなど、特別な理由が無い限りはcase文の処理の最後にbreakを指定するようにしましょう。
breakについては以下の記事でも詳しく解説していますので、ぜひ参考にしてください!
continueでスキップする
switch文をスキップするには、case文の中でcontinueを使います。
switch文でcontinueを使うと、breakと同じ動きをしますが、continueにレベルを指定することで、 ループの内部でswitch文を使用している場合、外側のループの処理を続行させることができます。
以下の例では、switch文の外側でiの値が1から4までループ処理を行っています。
iの値が3の場合、continueでswitch文をスキップします。
continueにはレベル2が指定されているので、switch文の後の処理は実行せず、外側のループ処理が再開されます。
<?php for ($i = 1; $i <= 4; $i++) { switch($i) { case 3: continue 2; } echo $i; echo '<br>'; } ?>
実行結果:
1 2 4
処理を途中でスキップするときに便利ですが、わかりづらいコードにもなりますので使用するには注意が必要です。
continueについては、以下の記事で詳しく解説しています!
switch文の応用的な使い方
ループでswitch文を使用する
複数の値を1つずつswitch文で比較を行いたいときは、配列に値を格納し、配列の要素数分繰り返し処理を行うforeach文の中でswitch文を使うと便利です。
以下にループ処理でswitch文を使用するサンプルを紹介します。
//配列の定義 $fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple']; //配列の要素数分ループする foreach ($fruits as $value) { switch ($value) { case 'apple': echo 'appleです。<br>'; break; case 'orange': echo 'orangeです。<br>'; break; case 'melon': echo 'melonです。<br>'; break; default: echo 'それ以外です。<br>'; } }
実行結果:
appleです。 orangeです。 melonです。 それ以外です。 それ以外です。
実際のプログラミングでも、このように繰り返し処理の中でswitch文で値を1つずつ比較して処理を行うことはよくあります。
比較演算子を使用する
switch文でもcase文での条件分岐で比較演算子を使用することができます。
比較演算子を使用することでif文と同様に「◯◯以上の場合」、「◯◯以下の場合」のような分岐が可能です。
$age = 45; switch ($age) { //年齢が20歳以下 case $age < 20: echo '20歳以下です。'; break; //年齢が20歳以上、50歳以下 case $age > 20 && $age < 49: echo '21~49歳です。'; break; //年齢が50歳以上 case $age > 50: echo '50歳以上です。'; break; }
実行結果:
21~49歳です。
このようにswitch文でも比較演算子の使用が可能なことがわかりましたね!
switch文でこのような比較演算子を使用した分岐処理はあまり行いませんが、単純な比較で比較条件がたくさんあるときにはswitch文を使用しても良いでしょう。
入れ子でのswitch文
switch文はcase文の後に、更に入れ子でswitch文での分岐処理を記述することが可能です。
以下にcase文での実行処理で、更にSwitch文で多分岐を行う場合のサンプルを紹介します。
<?php $fruits = 'apple'; $value = 100; switch ($fruits) { case 'apple': switch($value){ case 50: echo 'appleの値段は50です。<br>'; break; case 100: echo 'appleの値段は100です。<br>'; break; case 150: echo 'appleの値段は150です。<br>'; break; } break; case 'orange': break; case 'melon': } ?>
実行結果:
appleの値段は100です。
このようにSwitch文での入れ子処理が可能なことがわかりますね!
しかし、階層が深くなりすぎるとソースコードの可読性が落ちてしまいますので、注意しましょう。
まとめ
今回は、switch文の使い方について、
- switch文とは
- switch文の基本的な使い方
- switch文の応用的な使い方
- continueとbreakの使い方
などについて解説しました。
複数分岐を書くのに便利なswitch文ですが、型の比較まで行われない点や、defaultとcontinueの使い方には注意してください。
switch文の使い方について忘れてしまったら、この記事を思い出して下さい!