Search

検索したいワードを入力してください

2019年01月17日

【PHP入門】switch-case文の特徴と書き方

PHPにはswitch文という条件分岐構文があります。同じような構文でif文がありますが厳密には挙動や使い方が異なります。この記事ではswitch文の基本的な使い方からif文との違いを紹介していきます。PHP初心者の方はぜひ読んでみてください。

PHPのswitch-case文とは

他の言語でもサポートされていますが、PHPにもswitch-case文という条件分岐構文があります。同じような構文でif文がありますが厳密には挙動や使い方が異なります。

プログラミング初心者にとってif文とswitch文の使い分けは、なかなか難しいでしょう。この記事ではswitch-case文の基本的な使い方からif文とはどのような違いがあるのか、を中心に紹介していきます。

switch文の特徴と書き方

まずはじめに、switch-case文の特徴と書き方を紹介します。PHPにおいてもC/C++などの他のプログラミング言語と書き方はほとんど一緒ですので、他の言語を習得済みの方はすぐに理解できるでしょう。

switch文の基本

switch文は「条件分岐構文」と前述しましたが、if文と同じようにある条件に合致した場合はそれに対応する処理を行う、という動作が基本となります。

if文とは違い、指定をしないと基本的に「緩やかな比較」が行われ、型に関係なく条件処理が行われることが特徴です。こちらに関しては後に詳しく説明します。

このswitch文の基本特性はPHPに限らず他の言語においても同様ですので覚えておきましょう。

switch文の使い方

switch文は以下のような基本構文から成り立ちます。
switch( 変数 ){
case 条件1:
処理1;
break;
case 条件2:
処理2;
break;
default:
処理3;
break;
}

与えられた「変数」が「条件1」と合致したとき「処理1」を実行した後にbreak(switch文から抜けだ)し、「条件2」と合致したとき「処理2」を実行しbreakする、どれにも当てはまらない場合defaultの「処理3」を実行する、といった流れがswitch文の基本です。

defaultはif文で言うならばelseにあたります。defaultは書かずcaseだけでも大丈夫です。また、補足ですがPHP7.0からdefaultを複数記述するとエラーがはかれるようになりました。

サンプルコード

前述の説明だと少しわかりずらいのでサンプルコードを見てみましょう。以下のPHPのサンプルコードは、switch文の最も簡単な例です。
<?php
$num = 3;
switch( $num ){
case 1:
echo 'numは1です。';
break;
case 2:
echo 'numは2です。';
break;
case 3:
echo 'numは3です。';
break;
default:
echo 'numは4以上です。';
break;
}


出力結果
numは3です。

if文で同じ動作を記述した場合

switch文は基本的にif文での書き換えが可能であることが多いです。先ほどのサンプルコードをif文で書き換えると以下のようになります。
<?php
$num = 3;
if( $num == 1 ){
echo 'numは1です。;
}elseif( $num == 2 ){
echo 'numは2です。;
}elseif( $num == 3 ){
echo 'numは3です。;
}else{
echo 'numは4以上です。;
}


出力結果
numは3です。

このように同じ挙動をif文でも書くことができます。書き分けや、この二つの構文の違いはまた後に説明します。

switch文の構文

switch文に基本的な使い方を紹介しましたが、PHPにおいてif文をif( ):endif:を使っても書けるようにswitch文もswitch( ):endswitch:で記述することもできます。

また、case 条件:のように条件の後ろにはコロン:をつけていましたがPHPでは、case 条件;のようにセミコロン;を使って書くことが可能です。ただし、コードが読みづらくなるのであまりオススメしません。

switch文とif文の違いは?

switch文とif文は書き換えが基本的に可能であると前述しましたが、switch文とif文は何が違うのでしょうか?実は条件分岐の挙動が少し異なります。

複数の条件分岐(elseif)を持つif文構造は、まずはじめにif( )の条件を確認し、合致しなかったら次のelseif( )の条件を確認、違うならまたその次のelseif( )の条件...、のよう二岐の条件分岐を上から順に処理していきます。

一方switch文は変数と合致するcaseのところに一度で飛びます。そのため基本的にswitch文の方が処理速度が速い場合が多いです。

if文とswitch文の使い分け

なかなかプログラミング初心者にとって難しいのがif文とswitch文の使い分けです。

基本的に二つの場合分け(二岐条件分岐)や、単純な一つだけの条件処理の場合はif文を用い、複数の条件分岐(多岐条件分岐)のときはswitch文を使うようにしましょう。

中小規模のプログラムであれば、そこまで無理してswitch文を使うことはありません。if文で事が足りればif文でも十分でしょう。

switch文の型比較について

switch文を使う上で頭に入れておかなければならないことがもう一つあります。それは型比較についてです。こちらに関してもPHPだけでなく他の言語にも言えることです。

switch文は緩やかな比較

switch文の条件分岐に使われる比較は「緩やかな比較」です。この説明でピンとこない人は少なくないと思うので、まず「緩やかな比較」について説明していきます。

一般的に比較演算子には「緩やかな比較」と「厳密な比較」という2種類の比較が存在します。前者は比較演算子==を用い、後者は===を用いる比較のことを指します。実際にPHPサンプルコードを見てみましょう。ここでは解かり易くif文で解説します。

緩やかな比較
<?php
$num = 1; // 整数型
if( num == 1 ) echo '「整数型」';
if( num == '1' ) echo '「文字列型」';


実行結果
「整数型」「文字列型」

厳密な比較
<?php
$num = 1; // 整数型
if( num == 1 ) echo '「整数型」';
if( num == '1' ) echo '「文字列型」';


実行結果
「整数型」

このように「緩やかな比較」では型の一致までは吟味せず、「厳密な比較」では型の一致まで厳格に吟味します。switch文においてのデフォルトの比較は「緩やかな比較」になります。

特に「緩やかな比較」でも問題ないことが多いのですが、真偽値における「緩やかな比較」はtrue1の他にも'PHP'などの文字列も「真」の判定になりますので注意が必要です。

switch文のさまざまな使い方

switch文の基本的な使い方を紹介してきました。この章ではまだ紹介していない他の使い方をいくつか紹介していきます。

breakを付けずに使う

case:の処理末尾にはbreak;を記述すると紹介してきましたが、実は必ずしも記述しなければならない、ということはありません。break;はswitch文から脱出させるためだけの命令です。

例えば以下のようなPHPコードはどうなるでしょうか?
<?php
$num = 2;
switch( $num ) {
case 1:
case 2:
case 3:
echo 'numは3以下の自然数です。;
break;
default:
echo 'numは3より大きい値です。';
break;
}


実行結果
numは3以下の自然数です。

このように、複数の条件合致のswitch文も記述することが可能です。ちなみにbreak;はfor文やwhile文から強制脱出するときにも使えます。

ループでswitch文を使用する

もちろんfor文やwhile文といったループ内でもswitch文は使用できます。ただしループを抜け出すときにswitch文を用いる場合一工夫が必要になります。

例えばifを使うのであれば、
<?php
while ( true ) {
/* 処理 */
if( ループ終了条件 ) break;
}

のように書くとループから脱出できます。しかしこの感覚のままswitch文で同じように
<?php
while ( true ) {
/* 処理 */
switch( ){
case ループ終了条件:
break;
default:
/* 処理 */
break;
}
}


と書くとswitch文からはbreak;で抜け出せますが、ループ自体から抜け出すことはできません。

その場合PHPで扱うことができるgotoを使うと解決できます。gotoは他の命令にジャンプさせるもので以下のように使うことができます。
<?php
while ( true ) {
/* 処理 */
switch( ) {
case ループ終了条件:
goto end; // end: ラベルまでジャンプ
default:
/* 処理 */
break;
}
}
end:
echo 'loop end';

比較演算子を使用する

今まで紹介してきたswitch文は、「緩やかな比較」で条件と合致した場合のみでしたが、if文のようにそれ以外の条件も定義することが可能です。例えば以下のようなコードPHPコードが書けます。

switch文で「厳密な比較」を行う場合
<?php
$num = '3'; // 文字列型
switch( $num ) {
case $num === 3:
echo '「整数型」';
break;
case $num === '3';
echo '「文字列型」';
break;
}


実行結果
「文字列型」

switch文で関係演算子を使う場合
<?php
$num = 1;
switch( $num ) {
case $num < 3:
echo 'numは3未満';
break;
case 3:
echo 'numは3';
break;
default:
echo 'numは3より大きい';
break;
}


実行結果
numは3未満

入れ子でのswitch文

switch文も入れ子(ネスト)にすることができます。以下のPHPコードはswitch文を入れ子にしたコード例です。ちなみに以下のコードはswitchの入れ子を用いた素数判定プログラムです。

<?php
$num = 2147483647;

switch ( $num ){
case $num <= 1:
echo $num.'は素数ではありません。';
break;
case 2:
echo $num.'は素数です。';
break;
default:
switch ( $num % 2 ){ // switchの入れ子
case 0: // 偶数の時
echo $num.'は素数ではありません。';
break;
case 1: // 奇数の時
$i = 3;
while( $i <= sqrt( $num ) ){
if( $num % $i == 0 ){
echo $num.'は素数ではありません。';
return;
}
$i += 2;
}
break;
}
break;
}
echo $num.'は素数です。';


実行結果
2147483647は素数です。

まとめ

いかがでしたでしょうか。PHPにおいてswitch文は重要な条件分岐構文です。if文との使い分けは慣れるまでに時間がかかるかもしれませんが、二岐分岐はif、多岐分岐はswitchというように使い分けると良いでしょう。

特に大きなプログラムを書く場合はswitch文を使うことで処理速度が大きく変わることがあるので、積極的に使ってみてください。

【PR】多くの人がプログラミングを諦めてしまう理由をご存知ですか?



近年プログラミングを勉強する人が増えています。

プログラミング学習者の多くは独学から取り組もうとしますが、だいたい80%ほどは3ヶ月も続かずに諦めてしまいます。早い人は1日目で。

多くの人がプログラミングを独学しようとして諦める理由は、次の3つ。
●モチベーションが維持できない
●エラーの原因・解決方法が分からない
●どう学習すればよいか分からない

TechBoostというプログラミングスクールでは、みんなと一緒にプログラミングをするのでモチベーションの維持ができ、分からないことがあればマンツーマンで教えてくれ、徹底的に研究された初心者向けの教材が揃っています。

TechBoostを卒業後、実際にエンジニアとして転職した方もいるほど。

本気でプログラミングを学びたい方は、一度無料のカウンセリングでご相談ください。プログラミングを嫌いになる前に。

tech boostについて

オーダーメイド型の学習コンテンツを提供する「tech boost」 は、エンジニアのキャリア支援に特化したサービスを複数展開している株式会社Branding Engineerが運営しているプログラミングスクールです。最短3ヶ月間で、未経験から『プログラミングの基礎』、『実際に業務で必要となるスキル』、『今のトレンドとなっている知識』まで学べ、ご希望の方にはプロのキャリアアドバイザーによる就業支援を行うことができます。

tech boost卒業生インタビュー

tech boostの卒業生の声を聞きました。あなたがプログラミングを学びたい理由を、一度考えてみてください。
営業→Javaエンジニア→Rubyエンジニアと転向し、第一志望のFinTech企業で働く山下さん
元営業、ビジネスのわかるエンジニアを目指す菅原さん
サンフランシスコに交換留学し、シリコンバレーのVCでインターン中の梅本さん
予備校の営業から半年でエンジニア転職を果たした小田島さん

tech boostの口コミ



Related