PHPの基礎 - 条件分岐

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要

プログラムは記述した順に実行されるのが基本であるが、条件により実行する処理を分岐させる場合がある。
ここでは、if文やswitch文を使用して、処理を分岐する方法について記載する。


if文の基礎

if文は、条件により処理を分岐させるために使用する。

if文の書式は、以下の通りである。
条件式には、==>等の比較演算子を使用した条件式を記述する。(比較演算子については、次のセクションを参照すること)

if(条件式)
{
   <条件式が真の時に実行する処理>
}


実行される処理が1つだけの場合は、ブロックを省略してもよい。

if(条件式)
   <条件式が真の時に実行する処理>


以下の例では、変数Numに格納した値が20以上かどうかを判別して、真であればブロック内の処理を実行する。

 $Num = 30;
 
 if($Num >= 20)
 {
    print '年齢は20才以上です';
 }



論理値

if文の条件式には、比較演算子を使用した条件を記述するが、条件が正しい場合は、式そのものがtrue(真)という値を持つ。
条件が正しくない場合は、式そのものがfalse(偽)という値を持つ。

このように、比較演算子は評価した結果として、true(真)かfalse(偽)のいずれかの値を返す。
この2つの値が論理値である。(論理値はデータ型の1つで、trueまたはfalseのいずれかである)

比較演算子のように結果として論理値を返すが、変数に明示的に論理値を代入することもできる。

 $flag = true;
 
 if($flag)
 {
    <条件式が真の時に実行する処理>
 }


また、if文の条件式に他のデータ型の値を記述する場合、自動的に論理値に型変換が行われて評価される。
型変換が行われて、false(偽)となる値は以下の通りである。
上記以外の値は、全てtrueに変換される。(例. 数値の15や文字列の"Hello"等はTRUEに変換される)

FALSE
整数の0と浮動小数点数の0.0
空文字""
文字列の"0"
要素の数が0の配列
NULL
メンバ変数の数がゼロであるオブジェクト



比較演算子

下表に、PHPで用意されている比較演算子(関係演算子)の種類を示す。

表. 比較演算子(関係演算子)

演算子 記述例 意味
== a == b bとaの値が等しい
=== a === b bとaの値が等しく型も等しい
!= a != b bとaの値が等しくない
<> a <> b bとaの値が等しくない
!== a !== b bとaの値または型が等しくない
> a > b bよりaが大きい
>= a >= b bよりaが大きいか等しい
< a < b bよりaが小さい
<= a <= b bよりaが小さいか等しい


値の比較

以下の例では、いくつかの比較演算子を使用している。
演算子に関する優先順位は、演算子の優先順位を参照すること。

 $num = 20;
 
 if($num == 20)
 {
    print "変数numの値は20と等しい";
 }


==演算子は、右辺と左辺のデータ型が異なる場合でも比較が行われる。
この時、自動的に型の変換が行われて、例えば、数値の5と文字列の"5"を比較した場合、文字列は数値に変換されて数値として比較される。
結果的にこの比較はtrueとなる。

文字列同士の比較では、strcmp関数を使用して比較するとこともできる。
なお、値が等しくないかどうかを判別するには、!=演算子または<>演算子を使用する。この時、値が等しくない場合はtrueを返す。

値とデータ型の比較

==演算子では、値が等しいかどうかをだけを判別するため、数値と文字列の比較でも等しくなる場合がある。
型が等しいかどうかも含めて比較するには、===演算子を使用する。

以下の例では、===演算子の右辺と左辺を比較して型と値が等しければtrueを返す。

 $num = 20;
 
 if($num === 20)
 {
    print "変数numの値は20と等しい";
 }


===演算子では、右辺と左辺のデータ型が異なる場合は、型変換は行われない。
以下の例では、データ型が異なるためfalseを返す。

 $num = 20;
 
 if($num === "20")
 {
    print "変数numの値は文字列の20と同一";
 }


なお、値またはデータ型が等しくないかどうかを判別するには、!==演算子を使用する。
この時、値またはデータ型が等しくない場合、trueを返す。

大小の比較

2つの値の大小を比較するには、<<=>>=演算子を使用する。

なお、文字列の値の大小を比較する場合、先頭の文字から辞書順で比較する。

 $num = 20;
 
 if($num > 10)
 {
    print "変数numの値は10よりも大きい";
 }
 
 if($num <= 30)
 {
    print "変数numの値は30以下である";
 }



論理演算子

論理演算子では、AかつB、AまたはB等のように、条件式を組み合わせて複雑な条件式を使用する場合がある。
このような時に論理演算子を使用する。

下表に、PHPで用意されている論理演算子を示す。

表. 論理演算子

演算子 記述例 意味
&&
または
and
a && b
a and b
aとbが共に真の場合に真
||
または
or
a || b
a or b
aかbの少なくとも1つが真の場合に真
^
または
xor
a ^ b
a xor b
aかbのどちらか1つだけが真の場合に真
! !a aが真の時に偽、偽の時に真


論理演算子では、左辺および右辺に関係演算子を使用した条件式を記述する。
そして、各条件式の評価の結果と論理演算子により、式全体の評価を論理値で返す。

演算子に関する優先順位は、演算子の優先順位を参照すること。


条件式が偽の時の処理(if..else)

if文では、条件式がfalse(偽)の時に実行する処理も記述することができる。

書式は以下の通りである。

if(条件式)
{
   条件式が真の時に実行する処理1
   条件式が真の時に実行する処理2
}
else
{
   条件式が偽の時に実行する処理1
   条件式が偽の時に実行する処理2
}


また、実行する処理が1文のみの場合は、ブロックを省略して以下のように記述してもよい。

if(条件式)
   条件式が真の時に実行する処理
else
   条件式が偽の時に実行する処理


 $old = 18;
 
 if($old >= 20)
 {
    print '年齢は20才以上です';
 }
 else
 {
    print '年齢は20才未満です';
 }



複数の条件分岐(if..elseif..else)

if文では、複数の条件式を組み合わせることも可能である。

書式は以下の通りである。

if(条件式1)
{
   条件式1が真の時に実行する処理
}
elseif(条件式2)
{
   条件式2が真の時に実行する処理
}
elseif(条件式3)
{
   条件式3が真の時に実行する処理
}
else
{
 全ての条件式が偽の時に実行する処理
}


まず、条件式1を評価して、真の場合はブロック内の処理を実行して終了する。 条件式1が偽の場合は条件式2を評価して、真の場合はブロック内の処理を実行して終了する。偽の場合は次の条件式を評価する。 全ての条件式が偽の場合、elseのブロック内の処理を実行して終了する。

なお、elseは不要であれば記述しなくてもよい。

 $domain = 'jp';
 
 if($domain == 'in')
 {
    print 'インドのトップレベルドメイン';
 }
 elseif($domain == 'cn')
 {
    print '中国のトップレベルドメイン';
 }
 elseif($domain == 'jp')
 {
    print '日本のトップレベルドメイン';
 }
 else
 {
    print '不明です';
 }



switch文

switch文は、変数に含まれている値により、各値と順次比較して一致する場合に処理する場合に使用する。
各値と順次一致しているかどうかを比較する時に使用すると、簡潔に記述できる場合がある。

書式は以下の通りである。

switch(式)
{
   case 値1:
      式が値1と等しい時の処理;
      break;
   case 値2:
      式が値2と等しい時の処理;
      break;
   case 値3:
      式が値3と等しい時の処理;
      break;
   default:
      式がいずれの値にも等しくない時の処理;
}


switch文では式の値を評価して、caseの後に記述された値と順次比較する。
一致する値が存在する場合は、その後に記述された処理を順次処理して、breakに達すると終了する。
defaultの処理は、いずれの値にも一致しない場合に実行される処理を記述する。

また、defaultは不要であれば記述しなくてもよい。

 $pref = '神奈川';
 
 switch($pref)
 {
    case '東京':
       print '関東です';
       break;
    case '千葉':
       print '関東です';
       break;
    case '神奈川':
       print '関東です';
       break;
    default:
       print 'その他'
 }


swtich文は、breakに達するまで逐次処理を実行するため、breakを省略する場合、他のcaseの後に記述した処理も引き続き実行する。
この特性を利用して、複数の値に一致した場合に同じ処理を行う場合は、以下のように記述する。

 $pref = '神奈川';
 
 switch($pref)
 {
    case '東京':
    case '千葉':
    case '神奈川':
       print '関東です';
       break;
    case '愛知':
       print '東海です';
       break;
    default:
       print 'その他';
       break;
 }



三項演算子

三項演算子は、3つの項目を使用する演算子である。

書式は以下の通りである。
条件式を評価して、trueであれば式1、falseであれば式2を返す。

<条件式> ? <式1> : <式2>


if文とは異なり、三項演算子は演算子の1つであるため、結果として式を返す。
if文のように、条件に応じた処理を記述するのではない点に注意すること。

 $lang = 'en';
 
 $msg = $lang == 'jp' ? 'こんにちは' : 'Hello';
 print $msg;