PHPのswitch文による条件分岐を使いこなす方法

  • このエントリーをはてなブックマークに追加
  • Pocket

スポンサードリンク

PHPのswitch文で複数の条件分岐を処理する方法をご紹介します。

条件分岐ならif文が一般的ですが、いくつものelse ifが続くような条件分岐だとswitch文が便利です。

ただ、PHP特有のゆるい型変換に苦しめられることもあるでしょう。

そんなswitch文の使い方と、注意点を理解すれば、面倒な条件分岐も簡単に使いこなせるでしょう。

 

switch文の基本

switc文の使い方

まずは曜日をswitch文で表示させてみましょう。

火曜日

変数に格納されたTueを元にswitch文で火曜日と表示させましたね。

if文で同じ動作を記述した場合

上記の曜日のサンプルをif文で記述してみましょう。

火曜日

if文だと、else ifが続くイメージですね。

もっと複雑な条件分岐だと記述がゴチャゴチャとなりますが、switch文ならスッキリ記述できます。

switch文の構文

if文では最初のかっこに条件式を記述しますが、switch文では対象だけを記述します。

対象に文字列が含まれていたら、対象より大きかったら、対象と等しいなら…などの条件式は、caseに記述します。

case
任意の処理
break

上記を1セットに、複数のcaseを記述します。

breakは必要?

breakcaseごとに付けるのは面倒ですが、もし省いたらどうなるのでしょう?

火曜日水曜日木曜日金曜日土曜日日曜日

条件に該当した火曜日以降が全部表示されてしまいました。

上記のように、switch文は該当したcaseで処理を実行し、次のbreakかswitch文の最後まで実行し続けてしまいます。

breakの付け忘れに注意しましょう。

switch文のさまざまな使い方

breakを付けずに OR条件での分岐

breakを付けるようご紹介しましたが、breakを付けずに OR条件(論理演算子:いずれかに該当した場合)の分岐もできます。

魚です。

該当したcaseから、次のbreakまでは処理が実行される性質を利用し、いずれかに該当した場合といった条件分岐もできます。

上記の例では、かつおイワシまぐろのいずれかに該当した場合魚です。と表示させました。

default は else の役目

先ほどの曜日のサンプルで、もし日付などの曜日以外の値が変数に格納されたら、どの曜日にも当てはまりません。

それは困りますね。

if文では、そういった例外的な値はelseで処理しますが、switch文ではdefaultで処理します。

曜日ではありません。

どのケースにも当てはまらない場合は、最後にdefaultを付けて処理するとよいでしょう。

比較演算子で「以上、以下」の条件分岐

switch文でもif文同様に、◯◯以上、◯◯以下を表す>(大なり)、<(小なり)などの比較演算子を使った条件分岐も可能です。

19~59歳

参考:比較演算子一覧

switch文の最初のカッコに変数$ageを指定しましたが、caseでも$age < 18のように比較演算子の左辺で使い、比較演算子で比較しています。

ダブって使っているので冗長なコードになっている感じもしますし、実際switch文でこのようなサンプルコードはなかなか見かけませんね。

一致するかどうか?の複数条件分岐に使いドコロがあるのでしょう。

switch文の型について

switch文は緩やかな比較

switch文は緩やかな比較==となっており、型まで厳密には比較しません。

5 seconds of summer

この結果にはビックリですね!

だって5'5secondsofsummer'同じ値だと判断されたのですから!

ここがswitch文でもハマる箇所であり、switch文は使わないべきだという論拠となる大きな要因だと思います。

詳しくは下記リンクでご紹介していますが、数字と文字列の変換は、PHPが気を利かせて同じ型で比較しやすいように、文字列を数値に自動変換してしまっているのです。

参考:比較演算子「==」で文字列比較

switch文で厳密に型まで比較

それではswitch文で型まで含めた厳密な比較をするサンプルコードです。

そのバンドはありません。

ようやく思うような結果が得られましたね。

上記サンプルでは、通常のswitch文とは逆になっています。

  • switch文の最初のカッコ内に、本来caseで指定する条件が入る
  • caseには、本来switch文の最初のカッコ内に入るべき条件式が入る

そして、以下のように動作しています。

  • もし、変数 $band の値と 5true だったら…

厳密比較は以下がポイントです。

  1. switch文の最初のカッコ内にtrueと書く
  2. case===を使って型まで厳密に比較する

HTML埋め込みでもスッキリ記述?

PHPはHTMLに埋め込んで記述する場合も多いものですが、ソースが汚くなりますね。

そんなときは、endswitchを使うと、スッキリ?書くことができますよ。

(好みの問題だとは思いますが…)

川崎

if文などでもよく使う書き方ですが、switch文では以下の点を注意しましょう。

 

  • switch文と最初のcaseの間で、空白を含む何かを出力すると構文エラーになる
  • 最後にendswitchを付ける

HTMLタグの間にピンポイントにPHPを挿入するなど、(好みの問題だとは思いますが)スッキリ記述できるのではと思います。

 

以上、switch文を見てきましたが、型の比較に注意すれば便利に使えますね。

しかも、if文に比べても処理が速い可能性があるとマニュアルに記載されています。

switch文では、条件は1度だけ評価され、 その結果が各case文と比較されます。 elseif文では、条件は、再度評価されます。 使用する条件が単純な比較処理よりも複雑な処理を行ったり、 重い繰り返し処理を行う場合、switchの方が より処理が速い可能性があります。

出典:PHPマニュアル・switch

switch文に限らず、PHPは型を意識せずコーディングができますが、それにより思わぬ誤動作を起こしたりします。

型を意識したコーディングを心がけたいものですね。

スポンサードリンク

  • このエントリーをはてなブックマークに追加
  • Pocket

コメントを残す

*