PHPの基礎 - 条件分岐
概要
プログラムは記述した順に実行されるのが基本であるが、条件により実行する処理を分岐させる場合がある。
ここでは、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;