PHPで条件によって処理を分岐する構文、switch文の基本的な使い方、応用的な使い方、またif文との違いについて解説します。
switch文の使い方(基本編)
switch文の書き方は次のとおりです。

- 丸括弧
()の中に「式A」、case句の後ろに「式B」を記述し、式Aと式Bが等しいかどうかを判定します。 - 式Aと式Bが等しくなければ、その
caseブロックの処理はスキップされます。 - 式Aと式Bが等しれば、その
caseブロック以降の処理が実行されます。 - switch文の終わりまたは
breakが出現したところで処理は終了します。 - 式Aがどの
caseとも等しくなければ、defaultブロックの処理が実行されます。defaultは省略可能です。 
「式A」「式B」と言っていますが、最もシンプルなswitch文では、式Aに変数、式Bに数値または文字列が入ります。変数の値が何なのかによって条件分岐をして処理をするという使い方です。
具体的に書いてみます。
$value = 2;
switch ($value) {
  case 1:
    echo 'valueは1です';
    break;
  case 2:
    echo 'valueは2です';
    break;
  case 3:
    echo 'valueは3です';
    break;
  default:
    echo 'valueは1でも2でも3でもありません';
    break;
}valueは2です
最初のcase 1:は、変数$valueの値と等しくないので実行されません。
2つ目のcase 2:は$valueの値と等しいので実行されます。そして、breakが記述されているのでswitch文を終了し、以下の処理は実行されません。
このbreakがとても重要です。基本的にはこのbreakをそれぞれのcaseブロックの最後に記述します。なんか面倒くさいですね。でもそういうものだと思ってください。イヤならif文を使え。
breakがないとどうなるか
breakをうっかり書き忘れるとこうなります。
$value = 2;
switch ($value) {
  case 1:
    echo 'valueは1です';
  case 2:
    echo 'valueは2です';
  case 3:
    echo 'valueは3です';
  default:
    echo 'valueは1でも2でも3でもありません';
}valueは2ですvalueは3ですvalueは1でも2でも3でもありません
どういうことかというと、switch文はスイッチをオンにすることはできても、オフにすることはできないんです。なんという馬鹿スイッチ。
最初はスイッチがオフの状態です。そしてcase 2:でスイッチがオンになったら、それ以降はずっとオンのままです。case 3:でオフになることはありません。なので、処理を終了したい場所にbreakを記述する必要があります。

無料で利用できるプログラミング学習サービスをお探しならば Code Lesson はいかがでしょうか。プロのエンジニアが監修した学習ロードマップで効率的に学習、AIに質問、最後にクイズで理解度をチェックできます。
switch文の使い方(応用編)
複数条件の指定
複数のcaseを連続して使うと、複数の条件をORでつないだのと同じことになります。
$value = 2;
switch ($value) {
  case 1:
  case 2:
  case 3:
    echo 'valueは1または2または3です';
    break;
  case 4:
    echo 'valueは4です';
    break;
}valueは1または2または3です
これは、スイッチが一度オンになったら二度とオフにはならない性質を利用したものです。case 2:でスイッチがオンになります。その次のcase 3:では値が一致しませんがスイッチはオフになりません。したがって、その下の処理が実行され、breakが現れたところで処理が終了します。

比較演算子や論理演算子を使う
switch文では、比較演算子(==, <, >など)や論理演算子(and, orなど)を使うこともできます。
$age = 63;
switch (true) {
  case $age < 20:
    echo '青二才';
    break;
  case $age >= 20 && $age < 65:
    echo 'ヤングマン';
    break;
  case $age >= 65:
    echo '高齢者';
    break;
}ヤングマン
まず、丸括弧()にtrueを入れます。←これすごく大事です。以降、caseの条件式がtrueならばスイッチがオンになり、処理が実行されます。
switch ($age)のように丸括弧の中に変数を記述せよという解説がこのインターネットには溢れているのですが、これは間違いです。
間違った例を試してみましょう。
$age = 0;
switch ($age) {
  case $age < 20:
    echo '青二才';
    break;
  case $age >= 20 && $age < 65:
    echo 'ヤングマン';
    break;
  case $age >= 65:
    echo '高齢者';
    break;
}ヤングマン
「青二才」と出力されることが期待されるのですが「ヤングマン」と出力されます。なぜでしょうか。
switch文では丸括弧内の式とcaseで指定した条件式が等しいときにスイッチがオンになります。
$age = 0の場合、丸括弧内には0が入っていることになります。- 1つ目の
caseはtrueなので丸括弧内の式0と等しくありません。 - 2つ目の
caseはfalseなので丸括弧内の式0と等しいです。 - したがって「ヤングマン」と出力されてしまいます。
 
気を付けましょう。
厳密な比較
もうお気付きかもしれませんが、switch文の比較は緩やかな比較です。厳密な比較ではありません。
| 緩やかな比較とは | 厳密な比較とは | 
|---|---|
比較演算子==で表される型の違いを考慮せずに比較する 1 == '1'はtrue1 == trueはtrue0 == nullはtrue | 比較演算子===で表される型を含めて比較する 1 === '1'はfalse1 === trueはfalse0 === nullはfalse | 
switch文で厳密な比較をしたいときはどうしましょう。switch (true)を使います。
$value = null;
switch (true) {
  case $value === 0:
    echo 'valueは数値の0です';
    break;
  case $value === '0':
    echo 'valueは文字列の0です';
    break;
  case $value === '':
    echo 'valueは空です';
    break;
  case $value === null:
    echo 'valueはnullです';
    break;
}valueはnullです
if文とswitch文の違い
if文とswitch文、どちらも条件分岐をするための構文です。どちらを使っても同じことができます。では、どちらを使えばいいのでしょうか。使い分けのルールがあるのでしょうか。
巷では
- 条件が少ないときはif文、多いときはswitch文を使え
 - 条件が複雑なときはif文、シンプルなときはswitch文を使え
 
みたいなことが言われています。が、私はぜんぜん違う考えで、文系の人はif文、理系の人はswitch文を使えばいいと思っています。
if文は「もし〇〇ならば、△△する。そうでなければ、××する。」のような文章をそのままコードにしたような構文です。一方、switch文はスイッチングによって処理を切り替える構文です。
あなたはどちらを使いますか。
でわでわ
無料で利用できるプログラミング学習サービスをお探しならば Code Lesson はいかがでしょうか。プロのエンジニアが監修した学習ロードマップで効率的に学習、AIに質問、最後にクイズで理解度をチェックできます。

	
コメント