
変数の値により場合分け(条件分岐)する場合
ひとつの変数に対する値ごとに処理内容が異なる場合分け(条件分岐)について、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
- 連想配列
- 連想配列のループ処理