PHP PHP入門講座 プログラミング

【PHPプログラミング入門講座】条件分岐 (switch文)

PHPプログラミングのキービジュアル

変数の値により場合分け(条件分岐)する場合

ひとつの変数に対する値ごとに処理内容が異なる場合分け(条件分岐)について、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, PHP入門講座, プログラミング
-, , , ,

Copyright© ハッピー・プログラミング・ライフ , 2020 All Rights Reserved.