変数の値により場合分け(条件分岐)する場合
ひとつの変数に対する値ごとに処理内容が異なる場合分け(条件分岐)について、if文で書いてみましょう。
例えば、順位を表す変数を$rankingとし、$rankingの値に対して獲得できるメダルの種類(金・銀・銅)を表示するPHPプログラムを書くと次のようになります。
<?php $ranking = 2; if($ranking == 1) { echo '金メダルです。'; } else if($ranking == 2) { echo '銀メダルです。'; } else if($ranking == 3) { echo '銅メダルです。'; } else { echo '表彰対象外です。'; }
このif文の書き方を見ると、全ての「if」、「else if」に対して「$ranking == *」と記述する必要があることが分かります。
このような場合は、if文を使うのではなく「switch文」を使うと、同じ変数を記述する必要がなくなります。
switch文を使うと、次のように書くことができます。
<?php $ranking = 2; switch($ranking) { case 1: echo '金メダルです。'; break; case 2: echo '銀メダルです。'; break; case 3: echo '銅メダルです。'; break; default: echo '表彰対象外です。'; }
if文、switch文のどっちを使わなければならないというルールはなく、好きな方を使って問題ありません。
上記の例の場合は、正直どっちでもOKです。
ただ、switch文を使うと便利だったり、プログラムが読みやすくなる場合もありますので、switch文についても理解しておきましょう。
switch文
では、switch文の具体的な説明をしていきます。
まずは、switch文の構文です。
<構文>
<?php switch(変数) { case 値1: 変数の値が値1の場合の処理 break; case 値2: 変数の値が値2の場合の処理 break; : default: 変数の値がいずれにも当てはまらなかった場合の処理 }
switchの直後にある( )には、「変数」を設定します。
そして、その変数の値とそれぞれのcaseに書かれている値を上から順に比較していき、一致したcaseに書かれている処理が実行されます。
caseの処理の最後には「break;」が書かれています。breakに到着するとswtich文のブロックから脱出し、switch文の次の処理に進みます。
もし、いずれのcaseの値にも当てはまらない場合は、「default:」の処理が実行されます。
なお、「default:」は必要ない場合は省略することができます。
caseの直後の値
前述では、caseの直後に数値を使用しましたが、PHPでは数値だけでなく、文字列を使用することも可能です。
例えば、次のような感じです。
<サンプルプログラム>
<?php $signal = 'blue'; switch($signal) { case 'blue': echo 'すすめ'; break; case 'yellow': echo 'ちゅうい'; break; case 'red': echo 'とまれ'; break; }
<実行結果>
すすめ
breakを記述しない場合
例えば、先程のサンプルプログラムの最初のcaseに対するbreakを削除してみましょう。
以下のようになります。
<?php $signal = 'blue'; switch($signal) { case 'blue': echo 'すすめ'; case 'yellow': echo 'ちゅうい'; break; case 'red': echo 'とまれ'; break; }
これを実行すると次のようになります。
<実行結果>
すすめちゅうい
どういうことかというと、$signalの値がblueなので、最初の「case 'blue':」にマッチし、「echo 'すすめ';」が実行されまが、その後にbreakがないため、「case 'yellow':」に進み、「echo 'ちゅうい';」も実行されてしまいます。
つまり、breakを書かない場合は、次のcase内の処理が実行されます。そして、breakのある場所、またはswitch文の最後までに記述されている処理が実行されてしまいます。
意図的にbreakを書いていなければ良いですが、書き忘れてしまった場合は、このような処理になりバグの原因になるため注意が必要です。
breakは書き忘れないようにしましょう。
複数の値に対する処理を共有する
逆に、breakを書かない場合のswitch文の特徴を利用して、PHPプログラムを書く場合もあります。
例として、都道府県がどの地方かを判定するサンプルプログラムを書きます(※注1)。
<?php $prefecture = '福岡県'; switch($prefecture) { case '北海道': echo '北海道地方です。'; break; case'青森県': case'岩手県': case'宮城県': case'秋田県': case'山形県': case'福島県': echo '東北地方です。'; break; case '茨城県': case '栃木県': case '群馬県': case '埼玉県': case '千葉県': case '東京都': case '神奈川県': echo '関東地方です。'; break; case '新潟県': case '富山県': case '石川県': case '福井県': case '山梨県': case '長野県': case '岐阜県': case '静岡県': case '愛知県': echo '中部地方です。'; break; case '奈良県': case '三重県': case '滋賀県': case '和歌山県': case '大阪府': case '京都府': case '兵庫県': echo '近畿地方です。'; break; case '鳥取県': case '島根県': case '岡山県': case '広島県': case '山口県': echo '中国地方です。'; break; case '徳島県': case '香川県': case '愛媛県': case '高知県': echo '四国地方です。'; break; case '福岡県': case '佐賀県': case '長崎県': case '熊本県': case '大分県': case '宮崎県': case '鹿児島県': case '沖縄県': echo '九州沖縄地方です。'; break; default: echo '地方を判断できませんでした。'; }
47都道府県も書いたので長いですね(笑)
このように書けば、switch文の複数のcaseの値に対して、共通の処理を実行させることができます。
これは、if文よりも便利なswitch文の使い方です。
例えば、$prefectureの値が「福岡県」「佐賀県」「長崎県」「熊本県」「大分県」「宮崎県」「鹿児島県」「沖縄県」のいずれかの場合は「echo '九州沖縄地方です。';」が実行され、その次の「break;」で、switch文のブロックから脱出します。
ちなみに、このswitch文で書いたPHPプログラムをif文に書き換えるとどうなると思いますか?
次のようになります(※注2)。
<?php $prefecture = '福岡県'; if($prefecture === '北海道') { echo '北海道地方です。'; } else if($prefecture === '青森県' || $prefecture === '岩手県' || $prefecture === '宮城県' || $prefecture === '秋田県' || $prefecture === '山形県' || $prefecture === '福島県') { echo '東北地方です。'; } else if($prefecture === '茨城県' || $prefecture === '栃木県' || $prefecture === '群馬県' || $prefecture === '埼玉県' || $prefecture === '千葉県' || $prefecture === '東京都' || $prefecture === '神奈川県') { echo '関東地方です。'; } else if($prefecture === '新潟県' || $prefecture === '富山県' || $prefecture === '石川県' || $prefecture === '福井県' || $prefecture === '山梨県' || $prefecture === '長野県' || $prefecture === '岐阜県' || $prefecture === '静岡県' || $prefecture === '愛知県') { echo '中部地方です。'; } else if($prefecture === '奈良県' || $prefecture === '三重県' || $prefecture === '滋賀県' || $prefecture === '和歌山県' || $prefecture === '大阪府' || $prefecture === '京都府' || $prefecture === '兵庫県') { echo '近畿地方です。'; } else if($prefecture === '鳥取県' || $prefecture === '島根県' || $prefecture === '岡山県' || $prefecture === '広島県' || $prefecture === '山口県') { echo '中国地方です。'; } else if($prefecture === '徳島県' || $prefecture === '香川県' || $prefecture === '愛媛県' || $prefecture === '高知県') { echo '四国地方です。'; } else if($prefecture === '福岡県' || $prefecture === '佐賀県' || $prefecture === '長崎県' || $prefecture === '熊本県' || $prefecture === '大分県' || $prefecture === '宮崎県' || $prefecture === '鹿児島県' || $prefecture === '沖縄県') { echo '九州沖縄地方です。'; } else { echo '地方を判断できませんでした。'; }
if文の場合は、全ての都道府県に対して変数$prefectureを書かなければならず、見づらいプログラムになってしまいます(※注3)。
このような場合は、switch文で書いた方が見やすく書くことができますよね。
※注1、※注2:これらのPHPプログラムを実行する場合は、PHPファイルの文字コードがUTF-8になっていることを確認しましょう。
現在のWebプログラムの標準の文字コードはUTF-8です。
日本語の文字のような、半角英数字以外の文字を使っている場合に、文字コードがUTF-8になっていなければ、プログラムが正常動作しないことがほとんどです。
※注3:比較演算子「===」は「==」を使ってもOKです。ただし「===」の方が処理が高速です。
理由は、少し難しい話ですが、「===」はプログラム実行時に、データ型をそのままに比較しますが、「==」はデータ型をチェックして必要に応じてデータ型の自動変換をするため少し処理が多いからです。
明らかにデータ型が分かる場合は「===」を使いましょう。
おわりに
今回はswitch文について説明しました。
switch文で書いた内容は、全てif文に書き換えることができます。
しかし、場合によって、switch文で書いた方が、読みやすかったり、便利だったりする場合があります。
if文とswitch文のそれぞれの特徴を理解して、両方使えるようにしておきましょう。
PHPプログラミング入門講座 〜 全記事一覧 〜
- PHPで開発された有名なWebサイト
- PHPでどのような機能が作れるか?
- サーバーについて理解しよう
- Webサーバーの処理について詳しく説明
- PHPプログラムの動作について説明
- パソコンにPHPの動作環境を構築しよう
- 一番簡単なPHPプログラムを書いてみよう
- ブラウザ画面にメッセージを表示しよう
- PHPタグの書き方と終了タグの省略
- 特殊なメッセージ(文字列)の書き方
- PHPプログラムで計算をしてみよう
- 変数
- 文字列の結合とヒアドキュメント
- ファイルの分割とファイルの読み込み
- コメント
- 定数
- 数値と文字列の性質・デバッグ
- 条件分岐 (if文)
- 論理型 (boolean型)
- 比較演算子
- 論理演算子
- 現在のページ:条件分岐 (switch文)
- 三項演算子
- 配列とforeach文
- 代入演算子 / 加算子 / 減算子
- ループ処理 (for文)
- ループ処理 (while文とdo-while文)
- break
- continue
- 連想配列
- 連想配列のループ処理