php

【php8】条件分岐のswitch文とmatch式の使い方を初心者向けに徹底解説!

phpのswitchとmatchの使い方

 

switch文とは?

「○○の場合は××の処理」「△△の場合は□□の処理」というように、条件によって処理を分岐させる制御構文です。

match式とは?

PHP8から導入された値を返すことのできるswitch文です。

 

この記事では、この2つの構文の使い方の他に、次の「疑問」についても解説します。

  • if文との違いは?
  • defaultbreakは使わない?
  • 条件(case)を複数指定できる?
  • 条件に文字列を指定できる?

 

できるだけわかりやすく解説するので、ぜひ最後まで読んでみて下さいね!

目次

switchの使い方式に数値を指定した場合式に文字列を指定した場合if文との違いは?if文の書き換え
breakやdefaultの省略switch文に複数条件を指定match式の使い方switchとmatchの違いmatch式に複数条件を指定




 📖目次に戻る

switch文の使い方

switch文は、指定した値によって処理を分岐することができる制御構文です。

構文 − switch文

switch (式) {

  case 値1 :

  //「式 == 値1」である場合に実行する処理

  break;

  case 値2 :

  //「式 == 値2」である場合に実行する処理

  break;

  case 値3 :

  //「式 == 値3」である場合に実行する処理

  break;

...

  default  :

  // 式が値1 ,2,3, ••• 全て不一致の場合に実行

}

phpのswitch文の処理の流れ

switch の後ろに指定した「式」と、case の後ろの「値」を比較して一致した場合に、用意していた処理が実行されbreakによってswich文を抜けます。

また、不一致の場合は次の「値」と比較され、いずれも一致しない場合は最後に dafault で用意した処理が実行されます。

 

そしてその「式」「値」の比較は、

「==」(緩やかな比較)によって行われます。
「==」(緩やかな比較)だから、文字列の '1' と数値の 1 の比較は一致するとみなされるよ

 📖目次に戻る

式に「数値」を指定した場合

式に「数値」を指定した場合の switch文を使用して処理を分岐させてみます。

例題

switch文の式に「$n」(数値の2を代入)を用意し、caseには「1」「2」「3」の値を用意します。

  • 変数 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文を使用して処理を分岐させてみます。

例題

switch文の式に「$score」(文字列の"B判定"を代入)を用意し、caseには「A判定」「B判定」「C判定」の値を用意します。

  • 変数 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判定」が一致したので、「すごいね!」が表示されました。

 

breakを書き忘れると、次のcaseの処理も実行されるから注意しようね

 📖目次に戻る

if文との違いは?

実は、switch文で記述した分岐処理は、if ~ else文を使って再現することができます。

と聞くと、switch文とif文の使い分けに悩むかもしれませんが、結論から言うと「可読性を考慮して」次の通りに使い分けると良いでしょう。

  • 分岐が2つ … if文を使用
  • 分岐が3つ … switch文を使用

ポイント

また、switch文 は先頭の式を1度評価するのに対し、if文 はそれぞれの条件式を一つずつ評価するので、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 == '○判定')が続くため、やや冗長と言えるのではないでしょうか。

 

switch文の方がコードがスッキリして読みやすいね



 📖目次に戻る

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 '努力が足りないね。';

} ?>

phpのswitch文のbreak命令とdefault句を省略した場合の処理結果

どっちなんだい!!

条件の合致したcase句(case 'B判定':)以降から全ての処理が実行されて情緒が不安定になりそうですね。

これでbreakの重要性がわかったのではないでしょうか。

 

switch文は、条件が合致した case から breakまで処理が実行されるよ

 📖目次に戻る

switch文に複数条件を指定

switch文は、基本的には式とcaseに指定した条件を一つずつ比較し処理を実行しますが、前述した通りbreakを記述しないと、後ろのcaseの処理も続けて実行されてしまいます。

しかし、

あえてbreak命令を書かず複数のcaseを指定することもできます。

これをフォールスルーと言います。

 

では、複数のcaseを列記するフォールスルーの例を見てみましょう。

 </>php

<?php

$food = 'カレー';

switch ($food) {

  case '蕎麦':

  case 'うどん':

    echo 'その食べ物は和食です。';     break;

  case 'カレー':

  case 'ハンバーグ':

     echo 'その食べ物は洋食です。'; // この処理が実行される     break;

  default:

    echo 'その食べ物は和食でも洋食でもありません';

} ?>

phpのswitch文の複数条件を指定した場合の処理結果

switchの後ろで指定した式($food) と、caseで指定した「カレー」が一致したので「その食べ物は洋食です。」が表示されました。

もちろん、変数$foodに「ハンバーガー」が入っていた場合も同様の結果になります。

これはつまり、caseを列記する 「or」で比較されるということです。

よって、変数$foodが「蕎麦 または うどん」の場合は「その食べ物は和食です。」が表示され、「カレー または ハンバーグ」の場合は「その食べ物は洋食です。」と表示されます。

 

今回みたいに、文を挟まずにcaseを列記する場合以外は break を省略しない方がいいね

 📖目次に戻る

match式の使い方

matchとは、php8から導入された「値を返すことのできるswitch文」です。

「値を返すことができる」とは、matchの処理結果を利用して変数に代入したり引数に渡すことができるということです。

構文 − match式

match (式){

値1 => 式1,

値2 => 式2,

値3 => 式3,

...

default => 式, // 省略可能(

};

default を省略する場合は、式と一致する条件を必ず用意しなければいけません。

phpのmatch式の処理の流れ

match の後ろに指定した「式」と、用意した「値」を比較して一致した場合に、処理が実行され match を抜けます。

また、不一致の場合は次の「値」と比較され、いずれも一致しない場合は最後に dafault で用意した処理が実行されます。

 

そしてその「式」「値」の比較は、

「===」(厳密な比較)によって行われます。
厳密な比較だから、文字列の '1' と数値の 1 の比較は不一致になるよ

 📖目次に戻る

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文の複数条件を指定した場合の処理結果

結果は先ほどと同じですが、さらにスッキリとしたコードになりましたね。

 

PHP8が使える環境にある方は、matchを使用することをオススメするよ

📖目次に戻る

最後に

いかがでしたでしょうか、今回はphpの基本である制御構文の「switch文」と「match」について解説しました。

もちろんこれ以外の制御構文についても解説していますので、興味のある方は是非こちらもチェックしてみて下さい。

php

PHP言語に関する基礎的な構文やデータ型や関数など、詳細な解説やコード例を提供しています。

続きを見る

最後までお読みいただき、ありがとうございました!



-php
-