第3章 条件分岐文を詳しく知って扱おう

3.2 switch文を使ってみよう

プログラムの流れを変える制御構文には、if文のほかに「switch文」があります。if文は様々な条件で分岐を行いますが、switch文はある変数の値に応じて分岐を行うことができます。そんなswitch文の使い方について学習していきましょう。

3.2.1 switch文の基本的な使い方

switch文は指定した式の値に応じた処理を設定することで、条件分岐を簡潔に記述することができます。

書式:switch文の基本構文

switch文は、複数のcaseの中から、式(変数や計算式)の値に合うものを選びその処理を実行します。式の値がcaseのどれにも当てはまらない時はdefaultの処理を行います。また、各caseの処理の最後にはbreak文を記述してswitch文を抜け、選択されたcaseの処理のみを行うようにしています。breakを省略してしまうと、その下のcaseの処理まで実行されるので注意が必要です。
switch文の処理の流れをフローチャートにすると、図3.2.1のようになります。


図 3.2.1 : switch文の基本構文のフローチャート

breakを含むswitch文で条件に応じた処理を行わせるプログラム

switch文を使ってランダムで生成した数値に応じたメッセージをWeb画面に表示させます。

ソース・フォルダー: myproj_basic/ch03
パッケージ: useSwitch1.php
アクセスURL:http://localhost/myproj_basic/ch03/useSwitch1.php

useSwitch1.php

解説

2行目で変数$numに組み込み関数mt_randを使って、ランダムな数値(1~9)を1つ代入しています。

4~23行目がswitch文になります。条件としては以下のように設定しています。
case 1: … 変数$numの値が1なら、変数$msgに「中吉」を代入してswitch文を抜けます。
case 2: … 変数$numの値が2なら、変数$msgに「小吉」を代入してswitch文を抜けます。
case 3: … 変数$numの値が3なら、変数$msgに「吉」を代入してswitch文を抜けます。
case 4: … 変数$numの値が4なら、変数$msgに「末吉」を代入してswitch文を抜けます。
case 5: … 変数$numの値が5なら、変数$msgに「凶」を代入してswitch文を抜けます。
default: … 上記のcase1~5以外なら、変数$msgに「大吉」を代入してswitch文を抜けます。

30行目で運勢結果とランダムで発生させた数値の確認のために、変数$numの値を画面に表示させています。

例として$numが3の場合のフローチャートの流れを、以下の図示します。

図 3.2.2 : useSwitch1.phpのフローチャート

実行結果からも確認できますが、switch文のcaseに対応した処理が行われているのが分かります。
もしも今回のswitch文の条件をif文で記述すると以下のようになります。if文、switch文どちらを使っても問題ありませんが、今回のような条件判定の場合はswitch文を利用することが多いです。

3.2.2 switch文のbreak文を省略した使い方

switch文はある変数や計算結果の値で、条件分岐を簡潔に記述できる制御構文です。基本的な使い方は前項で説明しましたが、caseの処理の最後のbreak文を省略して、次のcase文の処理を行わせることもできます。
switch文でbreak文を1つも使わなかった場合の流れをフローチャートにすると、図3.2.3のようになります。

図 3.2.3 : break文のないswitch文のフローチャート

case 1と式の解が等しい場合

処理① → 処理② → 処理③ → 処理④ と実行されます。

case 2と式の解が等しい場合

処理② → 処理③ → 処理④ と実行されます。

case 3と式の解が等しい場合

処理③ → 処理④ と実行されます。

式の解がどのcaseとも等しくない場合

処理④のみ実行されます。

break文がないと途中でswitch文を抜けることができずに、次のcaseの処理を実行することになります。

breakを一部含まないswitch文で条件に応じた処理を行うプログラム

別の画面からの入力値をswitch文を使って判定を行います。その時一部の条件にはbreakを記述せずに行った結果をWeb画面に表示して確認します。

ソース・フォルダー: myproj_basic/ch03
パッケージ: switchForm.php
アクセスURL:http://localhost/myproj_basic/ch03/switchForm.php

switchForm.php

ソース・フォルダー: myproj_basic/ch03
パッケージ: useSwitch2.php
アクセスURL:switchForm.phpからの画面遷移でアクセスされる

useSwitch2.php

解説

今回のプログラムはswitchForm.phpから入力した数値(月)をuseSwitch2.phpで受け取り、その結果をbreak文を一部含まないswitch文で条件判定を行います。

2行目でswitchForm.phpからの入力データを変数$monthに代入しています。

4~23行目がswitch文になります。一部のcaseにbreak文がない処理は以下のようになります。
case 3の場合:case 4へ進みます。
case 4の場合:case 5へ進みます。
case 5の場合:変数$msgに「$month.”月は春です。”」を代入しswitch文を抜けます。
case 6の場合:case 7へ進みます。
case 7の場合:case 8へ進みます。
case 8の場合:変数$msgに「$month.”月は夏です。”」を代入しswitch文を抜けます。
case 9の場合:case 10へ進みます。
case 10の場合:csse 11へ進みます。
case 11の場合:変数$msgに「$month.”月は秋です。”」を代入しswitch文を抜けます。
case 12の場合:case 1へ進みます。
case 1の場合:case 2へ進みます。
case 2の場合:変数$msgに「$month.”月は冬です。”」を代入しswitch文を抜けます。
defaultの場合:変数$msgに「1~12の月を入力して下さい。」を代入しswitch文を抜けます。

caseにbreak文がないと、break文が見つかるまで次のcaseへと進んで行きます。

例として$monthが1の場合のフローチャートを以下に示します。

図 3.2.4 : useSwitch2.phpのフローチャート

もしも今回のswitch文の条件をif文で記述すると以下のようになります。

ポイント
  • ある変数の値が複数の条件によって処理分岐する場合、switch文で行える。
  • break文の有無で、処理の動作が変わるので注意する。

NEXT>> 3.3 本章のまとめ