- 更新日: 2019年06月04日
- 公開日: 2019年06月03日
phpのswitch文を使って条件分岐する方法とif文との違いを徹底解説!
【はじめに】
今回は、switch文を解説します。
switch文がわかるようになると、
- 条件によって処理を分けること
ができるようになります。
ここでは、基本的な利用の仕方として
switch文とは
switch文の使い方
- 具体例(数値)
- 具体例(文字列)
を説明します。
加えて、
switch文を使うメリット (if文との違い)
switch文での比較 について
を説明します。
switch文とは
switch文は変数に代入される予定の値と比較し、その値に応じて処理を分けて実行する時に利用します。
そして、その分けるための条件が複数ある時に使われます。
例えば、変数にサイコロを振った時の1から6までのばらばらの数が入っていて、その変数の値それぞれで処理が違う場合などです。
switch文の使い方
switch文の書式
switch (変数){
case 値1:
変数の値が値1と等しい時の処理1;
変数の値が値1と等しい時の処理2;
break;
case 値2:
変数の値が値2と等しい時の処理1;
変数の値が値2と等しい時の処理2;
break;
case 値3:
変数の値が値3と等しい時の処理;
break;
default:
変数の値が値1、値2、値3のどれにも等しくない時の処理;
}
具体例(数値)
変数に数値が代入されている場合の例です。
<?php
switch ($val) {
case 0:
echo "変数valの値は0に等しい";
break;
case 1:
echo "変数valの値は1に等しい";
break;
case 2:
echo "変数valの値は2に等しい";
break;
}
?>
このプログラムが実行されると、変数valに代入されている値によって、結果の表示内容が変わります。
変数valに0が代入されている場合には、
変数valの値は0に等しい
と表示されます。
また、変数valに1が代入されている場合には、
変数valの値は1に等しい
と表示されます。
そして、変数valに2が代入されている場合には、
変数valの値は2に等しい
と表示されます。
また、変数valに代入されている値が、0、1、2 のどれでもない場合には、何も表示されません。
変数valに代入されている値が、0、1、2 ではない場合にも何か処理をする必要がある場合には、default を使用します。
default は、case の特別な場合を指します。defaultは全ての case に該当しない場合に実行されます。
なお、全ての case に該当しない時に、処理をすることがなにもない場合には、default を記述する必要はありません。
defaultを使用した例
<?php
switch ($val) {
case 0:
echo "変数valの値は0に等しい";
break;
case 1:
echo "変数valの値は1に等しい";
break;
case 2:
echo "変数valの値は2に等しい";
break;
default:
echo "変数valの値は0、1、2のいずれでもない";
}
?>
このプログラムが実行された時に、変数valに代入されている値が、0、1、2 ではない場合には、
変数valの値は0、1、2のいずれでもない
と表示されます。
具体例(文字列)
switch文では、文字列を比較対象にすることもできます。
例:
<?php
switch ($str) {
case "apple":
echo "str は 「apple」です";
break;
case "orange":
echo "str は 「orange」です";
break;
case "grapes":
echo "str は 「grapes」です";
break;
}
?>
break について
switch文の処理は、switch文が終わるか、または最初の breakまでを実行します。
caseの終わりにbreakを書かない場合は、次にもcaseがあった場合には、それも実行し続けます。
例えば、以下のようなプログラムがあった場合、
<?php
switch ($val) {
case 0:
echo "変数valの値は0に等しい";
case 1:
echo "変数valの値は1に等しい";
case 2:
echo "変数valの値は2に等しい";
}
?>
変数valの値が、2の時は、
変数valの値は2に等しい
と表示されます。
変数valの値が、1の時は、
変数valの値は1に等しい変数valの値は2に等しい
と表示されます。
そして、変数valの値が、0の時は、
変数valの値は0に等しい変数valの値は1に等しい変数valの値は2に等しい
と表示されます。
変数valの値によって、処理を分けるには、breakを書きます。
また、breakがないときの流れを利用して、次のように複数のcaseに対して、同じ処理を実行するように処理をまとめる時があります。
<?php
$str = 'orange';
switch ($str) {
case 'apple':
case 'orange':
echo 'フルーツ';
break;
case 'carrot':
case 'cabbage':
echo '野菜';
break;
default:
echo 'フルーツでも野菜でもない';
}
?>
このプログラムを実行した場合、変数str の値が文字列の 'apple'または'orange'の時に
フルーツ
と表示されます。
また、変数str の値が文字列の 'carrot'か'cabbage'の時に
野菜
と表示されます。
switch文を使うメリット(if文との違い)
条件によって、処理を分ける時には、if文を使うこともできます。
先ほどの例の変数strの値によって、フルーツか野菜かを表示するプログラムは、if文を使うと、以下のようになります。
<?php
$str = 'orange';
if (($str == 'apple') or ($str == 'orange')){
echo 'フルーツ';
} elseif (($str == 'carrot') or ($str == 'cabbage')){
echo '野菜';
} else {
echo 'フルーツでも野菜でもない';
}
?>
仮に、条件としてバナナ(banana)が増えた時には、switch文の場合には、
case 'apple':
case 'orange':
の下に
case 'banana':
を追加することで対応できます。
if文の場合には、
if (($str == 'apple') or ($str == 'orange')){
と書かれている条件に
if (($str == 'apple') or ($str == 'orange') or ($str == 'banana')){
のように条件文の or 以降が追加されます。
条件が増えると、横に長くなっていきます。
見づらさを軽減する目的として、
if (($str == 'apple') or
($str == 'orange') or
($str == 'banana')){
のように縦に並べた書き方をする場合もあります。
こう書かれているif文に、条件をさらに増やす場合には、($str == 'banana')){ の最後の 「){」を取り、追加された条件の後ろに「){」を書き足すのを忘れないようにする必要があります。
条件を1つ追加するだけでも、if文の場合には、変更箇所が増え、注意する点が多くなります。
このように、switch 文と同じことは、if 文を使っても書けます。異なる条件が付け加わる場合には、if文では、else if文を記述することになります。条件が増えると、else if 文が増えることになります。
switch文に比べて、プログラムの書き方が複雑になります。
分岐処理の全体を理解しやすく書くときには、swich文が向いています。
switch文とif文の使い分け方
switch 文を使うか、if文を使うかを迷ったときには、条件がどうなっているかで使い分けます。
if 文に向いている条件
- 変数の値がある特定の値よりも大きいかったり小さいさかったりなど、条件に幅がある時
- 条件に変数が複数使われている時
- 複数の条件が組み合わされている時
- 分岐する処理が2つしかない時
switch 文に向いている条件
- 変数がある値になる時に処理を分ける。しかも、その値が3つ以上と多くの種類になっている時
switch文での比較(緩やかな比較)について
以下のような switch 文があるとします。
<?php
$value = true;
switch ($value){
case 'error’:
echo 'ERROR';
break;
case ‘ok’:
//breakは書かずに省略しています。
case true:
echo 'TRUE' ;
break;
default:
echo ”OTHER";
break;
}
?>
このswitch文の結果は「TRUE」と表示されると思う人もいるかもしれません。
しかし、実際には、「ERROR」と表示されます。
これはswitch文の引数の比較を行う処理が内部では 「===」ではなく、 「==」 による比較となっているためです。
「==」 による比較は「緩やかな比較」といいます。
ちなみに、「===」による比較は「厳密な比較」といいます。
比較の時に行われていること
PHPには表面的には型というものが存在しないように思えます。
しかし、内部では型情報を保持しています。そして、比較を行うときに自動的に型変換しています。
緩やかな比較をするということは、型を自動変換して比較するということです。厳密な比較をするということは型の一致も前提として比較を行っています。
そのため、switch文の引数と異なる型で条件を指定すると比較をするときに内部で型変換が起こり、予想外の結果になる可能性があります。
緩やかな比較を避ける方法
緩やかな比較を避けるために、 switch文の引数は、true として、caseの条件に 「===」を用いた比較を書くことで、厳密な比較を行わせる書き方があります。
例
<?php
$value = true;
switch (true){
case $value === 'error’:
echo 'ERROR';
break;
case $value === ‘ok’:
//breakは書かずに省略しています。
case $value === true:
echo 'TRUE' ;
break;
default:
echo ”OTHER";
break;
}
?>
このプログラムが実行されると、
TRUE
と表示されます。
ただし、この書き方には賛否両論があります。
switch文は、「緩やかな比較」を前提として利用し、「厳密な比較」が必要な場合には、無理してswitch文を使わず、if文で書くという意見もあります。
【補足説明】
引数
引数とは、
「ひきすう」と読みます。
関数を実行するときに、関数の中で処理をするために、渡すデータのことを指します。
また、switch 文では、条件判定の case に値を渡すために記述します。
型変換
型変換とは、あるデータ型の値を別の型に変換すること。
例えば、文字列を考えてみる。アルファベットのaは、プログラム上で文字として利用する場合には、”a” のように「"(ダブルクォート)」か「'(シングルクォート)」で囲みます。
同じように、10 という数字を「"(ダブルクォート)」で囲み、”10”とするとこれは文字となります。
型という表現をすると、「”10”は文字列型のデータ」ということができます。
文字列型の“10”というデータを計算に使用したい場合には、文字列型のままでは計算に利用できないため、整数型としての10に変換する処理を行う必要があります。
これが、型変換です。
【参考サイト】
PHP マニュアル
https://www.php.net/manual/ja/control-structures.switch.php
switch文での比較(緩やかな比較)について
switch文は、条件によって実行する処理を分けます。
この意味では、if文と同じですが、if文と比べ、処理の流れを読み取りやすく記述することができます。
breakが書かれているかどうかで処理の流れが変わります。注意しましょう。
また、switch文の比較は、「緩やかな比較」です。
\Webサイト担当者としてのスキルが身に付く/
【まとめ】
- この記事を書いた人
- 坂田 健一