switch文とは?
match式とは?
この記事では、この2つの構文の使い方の他に、次の「疑問」についても解説します。
- if文との違いは?
- defaultやbreakは使わない?
- 条件(case)を複数指定できる?
- 条件に文字列を指定できる?

switch文の使い方
switch文は、指定した値によって処理を分岐することができる制御構文です。
構文 − switch文
switch (式) {
case 値1 :
//「式 == 値1」である場合に実行する処理
break;
case 値2 :
//「式 == 値2」である場合に実行する処理
break;
case 値3 :
//「式 == 値3」である場合に実行する処理
break;
...
default :
// 式が値1 ,2,3, ••• 全て不一致の場合に実行
}
switch の後ろに指定した「式」と、case の後ろの「値」を比較して一致した場合に、用意していた処理が実行されbreakによってswich文を抜けます。
また、不一致の場合は次の「値」と比較され、いずれも一致しない場合は最後に dafault で用意した処理が実行されます。
そしてその「式」と「値」の比較は、

式に「数値」を指定した場合
式に「数値」を指定した場合の switch文を使用して処理を分岐させてみます。
例題
- 変数 n の値が「1」と等しい場合は「nは1に等しい」
- 変数 n の値が「2」と等しい場合は「nは2に等しい」
- 変数 n の値が「3」と等しい場合は「nは3に等しい」
- それ以外の場合は「nはどの数値でもない」
と出力してみましょう。
</>php<?php
$n = 2;
switch ($n) {
case 1:
echo 'nは1に等しい';
break;
case 2:
echo 'nは2に等しい'; // この処理が実行される
break;
case 3:
echo 'nは3に等しい';
break;
default:
echo 'nはどの数値でもない';
} ?>

この例では、switchの後ろで指定した式($n) と、caseで指定した「2」が一致したので、「nは2に等しい」が表示されました。
式に「文字列」を指定した場合
式に「文字列」を指定した場合の switch文を使用して処理を分岐させてみます。
例題
- 変数 score の値が「A判定」と等しい場合は「素晴らしい!!」
- 変数 score の値が「B判定」と等しい場合は「すごいね!」
- 変数 score の値が「C判定」と等しい場合は「頑張ろう!」
- それ以外の場合は「まずは試験を受けよう」
と出力してみましょう。
</>php<?php
$score = 'B判定';
switch ($score) {
case 'A判定':
echo '素晴らしい!!';
break;
case 'B判定':
echo 'すごいね!'; // この処理が実行される
break;
case 'C判定':
echo '頑張ろう!';
break;
default:
echo 'まずは試験を受けよう';
} ?>

この例では、switchの後ろで指定した式($score) と、caseで指定した「B判定」が一致したので、「すごいね!」が表示されました。

if文との違いは?
実は、switch文で記述した分岐処理は、if ~ else文を使って再現することができます。
と聞くと、switch文とif文の使い分けに悩むかもしれませんが、結論から言うと「可読性を考慮して」次の通りに使い分けると良いでしょう。
- 分岐が2つ … if文を使用
- 分岐が3つ … switch文を使用
ポイント
if文の書き換え
if文との違いを確認するため、前項「式に文字列を指定した場合」のswitch文をif ~ else文に書き換えてみます。
</>php<?php
$score = 'B判定';
if ( $score == 'A判定' ) {
echo '素晴らしい!!' ;
} else if ( $score == 'B判定' ) {
echo 'すごいね!'; // この処理が実行される
} else if ( $score == 'C判定' ) {
echo '頑張ろう!';
} else {
echo 'まずは試験を受けよう';
} ?>

やはり、同じ条件式($score == '○判定')が続くため、やや冗長と言えるのではないでしょうか。

break や default の省略
break と defalt が省略できるかどうかは、結論から言うと次の通りになります。
- break … 省略すべきではありません (※ 例外あり)
- default … 省略可能ですが、おすすめしません
※breakをあえて記述しないテクニックも存在します ⇒ 次項で解説!!
「break」 がないと、後ろの case に指定した処理が続けて実行されてしまいます。
と言うのも、switch命令は条件の一致した case に処理を移すだけで、処理を抜ける仕組みがないからです。
「default」 は、省略することも可能ですが、どの条件にも一致しない場合の処理を明確にしておくためにも、記述することが望ましいでしょう。
それでは、前項「式に文字列を指定した場合」のswitch文の break とdefault がないパターンを見てみましょう。
</>php<?php
$score = 'B判定';
switch ($score) {
case 'A判定':
echo '素晴らしい!!';
case 'B判定': // この処理が実行される
echo 'すごいね!';
case 'C判定': // この処理が実行される
echo '努力が足りないね。';
} ?>
どっちなんだい!!
条件の合致したcase句(case 'B判定':)以降から全ての処理が実行されて情緒が不安定になりそうですね。
これでbreakの重要性がわかったのではないでしょうか。

switch文に複数条件を指定
switch文は、基本的には式とcaseに指定した条件を一つずつ比較し処理を実行しますが、前述した通りbreakを記述しないと、後ろのcaseの処理も続けて実行されてしまいます。
しかし、
これをフォールスルーと言います。
では、複数のcaseを列記するフォールスルーの例を見てみましょう。
</>php<?php
$food = 'カレー';
switch ($food) {
case '蕎麦':
case 'うどん':
echo 'その食べ物は和食です。'; break;
case 'カレー':
case 'ハンバーグ':
echo 'その食べ物は洋食です。'; // この処理が実行される break;
default:
echo 'その食べ物は和食でも洋食でもありません';
} ?>
switchの後ろで指定した式($food) と、caseで指定した「カレー」が一致したので「その食べ物は洋食です。」が表示されました。
もちろん、変数$foodに「ハンバーガー」が入っていた場合も同様の結果になります。
よって、変数$foodが「蕎麦 または うどん」の場合は「その食べ物は和食です。」が表示され、「カレー または ハンバーグ」の場合は「その食べ物は洋食です。」と表示されます。

match式の使い方
matchとは、php8から導入された「値を返すことのできるswitch文」です。
「値を返すことができる」とは、matchの処理結果を利用して変数に代入したり引数に渡すことができるということです。
構文 − match式
match (式){
値1 => 式1,
値2 => 式2,
値3 => 式3,
...
default => 式, // 省略可能(※)
};
※ default を省略する場合は、式と一致する条件を必ず用意しなければいけません。
match の後ろに指定した「式」と、用意した「値」を比較して一致した場合に、処理が実行され match を抜けます。
また、不一致の場合は次の「値」と比較され、いずれも一致しない場合は最後に dafault で用意した処理が実行されます。
そしてその「式」と「値」の比較は、

switch文とmatch式の違い
switch文とmatch式の違いは以下のとおりです。
- match 式の比較は、 switch 文の「==」緩やかな比較ではなく 「===」厳密な比較。
- match 式は値を返します。(処理結果を変数に代入したり、引数に渡すことができる)
- match 式の分岐は、 switch 文のように後の分岐に抜けたりはしません。(break命令が不要)
- match 式は、全ての場合を網羅していなければいけません。
注意すべき点は「default」を書き忘れた場合、指定した式が、全ての値とマッチしない = エラー になってしまうということです。
switch文と同様に、defaultは省略することもできますが、思わぬエラーを防ぐために指定しておくことをオススメします。
例として、先ほどのswitch文を、matchに書き換えてみましょう。
</>php<?php
$score = 'B判定';
$result = match ($score) {
'A判定' => '素晴らしい!!',
'B判定' => 'すごいね!', // この処理が実行される。
'C判定' => '努力が足りないね。',
default => 'まずは試験を受けよう'
};
echo $result; ?>

もちろん結果は先ほどと同じですが、switch文に比べbreak命令が不要なのでスッキリしていますね。
また、変数($result) に代入して利用できているので、値を返していることが確認できます。
match式で複数条件を指定
matchでは、switch文で行ったような複数のcase句を列記する代わりに、値をカンマで区切ります。
では、先ほどのswitch文で行ったフォールスルーをmatch 式に書き換えてみましょう。
</>php<?php
$food = 'カレー';
$result = match($food){
'蕎麦','うどん' => 'その食べ物は和食です。',
'カレー','ハンバーグ' => 'その食べ物は洋食です。', // この処理が実行される default => 'その食べ物は和食でも洋食でもありません',
};
echo $result; ?>
結果は先ほどと同じですが、さらにスッキリとしたコードになりましたね。

最後に
いかがでしたでしょうか、今回はphpの基本である制御構文の「switch文」と「match」について解説しました。
もちろんこれ以外の制御構文についても解説していますので、興味のある方は是非こちらもチェックしてみて下さい。
-
php
PHP言語に関する基礎的な構文やデータ型や関数など、詳細な解説やコード例を提供しています。
続きを見る
