初心者による初心者のためのPHP講座 第6回 条件分岐

初心者による初心者のためのPHP講座 第6回 条件分岐ここまで学んだ知識でも、変数の定義や関数を記述して簡単なプログラムを作成することは出来るはずである。

しかし、条件分岐やループ処理などの制御構文を記述することで、初めて複雑なプログラミングが可能になる。

今回は「条件分岐」について説明する。

「条件分岐」とは、特定の条件を満たすか否か判定し、その結果に応じて処理を割り当てる制御構文である。

条件分岐には「if文」、「switch文」が使われる。

if文

「if文」とは、「もし~ならば、処理を実行する」といった意味を持つ構文である。

条件式の評価を行い、その条件が真(ture)であれば、処理を実行する。

<?php
if (条件式) {
	処理;
}
?>

下の例では、変数$colorが、「red」であれば、echo()関数が実行され、「Red」と表示される。

<?php
if ($color == "red") {
	echo "Red";
}
?>

if文では、「()」内に評価する条件式を記述し、対応する処理は「{}」内に記述する。

条件式の評価の部分で使われている「==」は、比較演算子と呼ばれる構文で、この場合は、左辺と右辺の値が等しいことを意味している。

「$colorがredと等しい」か否かの評価、つまり「$colorがred」であるか否かの評価を行なっている。

上記のif文は、条件式の評価が偽(false)である場合は、何も行わない、単一の条件の評価であるが、「else if文」を使えば、最初の「もし(if) ならば」が偽であれば、「あるいは ならば」といった別の評価を行うことが出来る。

下記の例では「$colorがred」である場合は、「echo “Red”;」実行して、if文を終了するが、「$colorがred」でない場合は、続いて「$colorがblue」か否かの評価が行われる。

<?php
if ($color == "red") {
	echo "Red";
} else if ($color == "blue") {
	echo "Blue";
}
?>

「else if」文は、下記のように複数回記述することも出来る。

<?php
if ($color == "red") {
	echo "Red";
} else if ($color == "blue") {
	echo "Blue";
} else if ($color == "black") {
	echo "Black";
}
?>

「else if」は、空白を空けずに「elseif」と書いても良い。

個人的には、「else if」と書く癖があるが、同様の構文を持つJavaスクリプトで「elseif」と書くべきところを、「else if」と書いて失敗することがある。

そう言った意味では「elseif」で覚えたほうが良いかもしれない。

更に、「else文」を使えば、いずれの条件式評価も偽となった場合の処理を記述することが出来る。

<?php
if ($color == "red") {
	echo "Red";
} else if ($color == "blue") {
	echo "Blue";
} else if ($color == "black") {
	echo "Black";
} else {
	echo "ERR: Unknown Color";
}
?>

意図して「else」を使わない場合もあるが、例外的な処理として「else」を記述した方が良いケースも少なくない。

例えば、次のケースでは、すべての条件式評価が偽の場合は、変数$stringは、未定義となるが、「else文」で例外的な場合の代入値を定義することも出来る。(予め、$stringのデフォルト値をif文の前で定義して、それを例外的な場合の値としても良い)

<?php
if ($color == "red") {
	$string = "Red";
} else if ($color == "blue") {
	$string = "Blue";
} else if ($color == "black") {
	$string = "Black";
}
?>

「else if文」や「else文」を組み合わせる場合は、if文の条件式は先頭から順に評価されることを意識しなければならない。

いずれかの条件式が真となった時点でif文は終了されるため、条件式の順序がまずいと、予想外の結果になる可能性がある。

下記は、今まで学んだ内容のみで組み立てたサンプルである。

現在の時間の「分」が偶数であれば、「もう、~です。」、奇数であれば「まだ、~です。」と表示する。

<!doctype html>
<?php echo '<?xml version="1.0" encoding="utf-8"?>'; ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>if文</title>
</head>
<body>
<?php
$min = date("i");
$min_remainder = $min % 2;
if ($min_remainder == 0) {
	echo "もう、".date("H:i:s")."です。";
} else {
	echo "まだ、".date("H:i:s")."です。";
}
?>
</body>
</html>

上記のスクリプトの実行結果を表示

比較演算子

比較演算子とは、左辺と右辺の値を比較するための構文である。

そして比較の結果が真であれば「true」、偽であれば「false」を返す。

「if文」の説明でも、条件式の記述に比較演算子「==」を使用しているので、大まかには理解できていることと思うが、条件式を記述するために比較演算子は欠かせない。

「==」は左辺と右辺が等しいか比較する演算子であるが、次の結果は予想できるだろうか?

<?php
$a = 1;
if ($a == "1") {
	echo "Yes";
} else {
	echo "No";
}
?>

変数$aは、整数「1」として定義されているが、if文では、文字列「1」と等しいか評価を行なっている。

型が異なるわけであるが、PHPでの型の扱いについては、何度が述べてきたので、おそらく予想出来ていたと思うが、このケースは、「Yes」と表示される。

つまり、「==」では型の違いは無視される。

厳密に言えば、整数と文字列の比較の場合は、文字列は、自動的に整数型に変換された上で比較される。

しかし、PHPでは、型の評価を行う比較演算子が用意されているので、型を含めた比較を行うことも出来る。

以下に、PHPで用いられる比較演算子をリストする。

  • == ・・・左辺と右辺の値が等しい。
  • === ・・・左辺と右辺の値と型が等しい。
  • != ・・・ 左辺と右辺の値が等しくない。
  • <> ・・・ 左辺と右辺の値が等しくない。
  • !== ・・・ 左辺と右辺の値が等しくない、または型が等しくない。
  • > ・・・ 左辺が右辺より大きい。
  • >= ・・・ 左辺が右辺より大きい、または等しい。
  • < ・・・ 左辺が右辺より小さい・
  • <= ・・・ 左辺が右辺より小さい、または等しい。

以下のサンプルでは、様々な比較演算子をif文で使用してる。

<?php
if ($age >= 20) {
	echo "お酒、タバコが許されます。";
} else if ($age == 18) {
	echo "ようやく普通免許が取れますね。";
} else if ($age == 14) {
	echo "中二病の可能性があります。";
} else if ($age <= 12) {
	echo "運賃は、半額です。";
}
?>

論理演算子

「論理演算子」を使えば「AかつB」、「AまたはB」、「AかつB、またはAかつC」と言った条件を記述することが出来る。

つまり、複数の条件式を繋いで評価することが出来る。

PHPで用いられる論理演算子は下記のとおりである。

  • 左辺 && 右辺 ・・・ 左辺、右辺共に真。
  • 左辺 and 右辺 ・・・ 左辺、右辺共に真。
  • 左辺 || 右辺 ・・・ 少なくとも、左辺または右辺のどちらかが真。
  • 左辺 or 右辺 ・・・ 少なくとも、左辺または右辺のどちらかが真。
  • 左辺 xor 右辺 ・・・左辺または右辺の一方が真。両方が真の場合は、偽を返す。
  • !値(式) ・・・ 値(式)が偽である。値(式)が偽の時に真を返す。

次の例では、「&&」を使って、年齢(変数$age)、性別(変数$sex)の両方が特定の条件を満たすか判定している。

<?php
if ($age >= 18 && $sex == "male") {
	echo "結婚できます。";
} else if ($age >= 16 && $sex == "female") {
	echo "結婚できます。";
} else {
	echo "結婚できません。";
}
?>

また、論理演算子は、算術演算子と同様に「()」を使うことで、評価の優先順位を変えることが出来る。

以下の例では、まず「()」内が真であることが条件となる。

<?php
if ($sex == "male" && ($age == 25 || $age == 42 || $age == 61)) {
	echo "厄年です。";
} else if ($sex == "female" && ($age == 19 || $age == 33 || $age == 37)) {
	echo "厄年です。";
} else {
	echo "厄年ではありません。";
}
?>

性別と年齢の両方が真であることが、条件式が真となる条件であるが、年齢に関しては、「()」内のいずれかを満たせば真となる。

if文のネストと「{}」の省略

if文は、次のように別のif文にネスト(入れ子)することも出来る。

<?php
if ($sex == "male") {
	if ($age == 25 || $age == 42 || $age == 61) {
		echo "厄年です。";
	} else {
		echo "厄年ではありません。";
	}
} else if ($sex == "female") {
	if ($age == 19 || $age == 33 || $age == 37) {
		echo "厄年です。";
	} else {
		echo "厄年ではありません。";
	}
}
?>

if文内の処理が1行で書ける場合は、次のように「{}」を省略することが出来る。

<?php
if ($age >= 20)
	echo "成人です。";
?>

if文での真偽の解釈と演算子を省略した条件式

if文は、条件式の比較演算子を省略し、次のように書くことも出来る。

<?php
if ($value) {
	echo "tureです。";
}
?>

これは次の式の省略形であるが、比較演算子が、型を無視する「==」である以上、話は単純ではない。

<?php
if ($value == true) {
	echo "tureです。";
}
?>

つまり、条件式が真となるのは、$valueにtrueが代入されている時だけとは限らない。

変数$valueが、整数の「0」、浮動小数点の「0.0」、空の文字列、文字列「”0″」、NULL以外の値を持つ時は、常に真となる。

他にも、変数が配列の場合やオブジェクトの場合も考慮する必要があるが、ここでは省略する。

上記の2つの例のような条件式であっても、変数の型が論理値であると確信できる場合は、変数に格納された値がtrueであることの判定に十分に使えるが、そうでない場合は、変数に何か値が格納されているたけで、条件式が真となる可能性があることを覚えておく必要がある。

場合よっては比較演算子に「===」を使うべきである。

また、比較演算子を省略し、条件式に変数のみを記述する方法は、変数が空である可能性を除き、0などの条件式が偽となる値が変数に格納されることがないと確信できるなら、変数に値が格納されているか否かの判定に使うことも出来る。

同様に、次のような省略も成立する。

if (!$value) {
	echo "tureです。";
}
?>

ここでは、論理演算子「!」を使用しており、「$valueが、trueでない」という意味になる。

if文では、必ずしも型を判定する比較演算子を使用する必要はなく、むしろ必要のない判定は省いた方が処理上もスマートであるが、変数に格納される可能性のある値を十分に把握しておかなければ、予想外の結果になる可能性がある。

switch文

switch文は、if文でも代用できるが、変数の値に応じて、処理を割り当てたい時などに適した構文である。

下記のように、case文やbreak文と組み合わせて使用する。

<?php
switch (式または変数){
	case 値1:
		式または変数が、値1と等しい場合の処理;
 		break;
	case 値2:
 		式または変数が、値2と等しい場合の処理;
		break;
	case 値3:
  		式または変数が、値3と等しい場合の処理;
		break;
	default:
		式または変数が、いずれの値とも等しくない場合の処理;
}
?>

「break」は、ループ(繰り返し)処理を抜けるための制御構造であり、条件に一致し、それに応じた処理が終了した時点で。switch文を終了するために記述している。

switch文は、if文と異なり、一度、いずれかの条件に一致しまうと、「break」が記述されている行まで、(case文の条件を無視して、本来、他の条件のための)処理の実行を継続してしまうため、「break」の記述が必要になる。

必要がなければ、「defaut」は省略しても良い。

次の例では、曜日が格納されている変数$dateの値に応じてメッセージを変えている。

<?php
switch ($date){
	case '月曜日':
		echo '休み明けは、ダルいですね。';
 		break;
	case '金曜日':
 		echo '明日からお休みです。';
		break;
	case '日曜日':
  		echo '明日から仕事です。';
		break;
	default:
		echo '今日も頑張りましょう。';
}
?>

以下の例では、複数の条件に、同じ処理を割り当てている。

<?php
switch ($country){
	case 'イギリス':
		echo 'ヨーロッパ';
 		break;
	case '日本':
  		echo 'アジア';
		break;
	case 'ドイツ':
 		echo 'ヨーロッパ';
		break;
	case '中国':
  		echo 'アジア';
		break;
}
?>

次は、「break」の記述を忘れた例である。

<?php
switch ($country){
	case 'イギリス':
		echo 'ヨーロッパ';
	case '日本':
  		echo 'アジア';
		break;
	case 'ドイツ':
 		echo 'ヨーロッパ';
		break;
	case '中国':
  		echo 'アジア';
		break;
}
?>

この場合、変数$countryの値が「イギリス」の場合、まず「ヨーロッパ」と表示し、「アジア」と表示した後に、「break」と出会って、switch文を終了する。

これを逆手に取れば、次のような処理を記述することも出来る。

<?php
switch ($country){
	case 'イギリス':
	case 'ドイツ':
 		echo 'ヨーロッパ';
		break;
	case '日本':
  		echo 'アジア';
		break;
	case '中国':
  		echo 'アジア';
		break;
}
?>

上での例では、変数$countryの値が、「イギリス」または「ドイツ」である場合に、「ヨーロッパ」と表示される。

三項演算子

「三項演算子」は、条件分岐を行う構文のように見えるが、演算子であり、条件に応じて式を返す。

条件に応じて処理を実行するif文、switch文とは本質的に異なる。

今まで学んだ演算子は、数学で言うところの2つの項を使用する「二項演算子」であるが、「三項演算子」は、唯一、3つの項を使用する演算子である。

個人的には、「三項演算子」は使わず、if文で記述することが多いが、知っておかないと、他の人が書いたプログラムを読めなくなってしまう。

「三項演算子」は、以下のようにシンプルに記述できる。

条件式 ? 式1 : 式2

条件式が真の場合は、「式1」を返し、偽の場合は「式2」を返す。

次の例では、返された式を変数$strに代入するように記述している。

変数$ageが20以上の場合は、「成人です。」を返し、変数$strに代入され、20未満の場合は、「未成年です。」が返されて変数$strに代入される。

<?php
$str = ($age >= 20) ? "成人です。" : "未成年です。";
echo $str;
?>

条件式を囲む「()」は省略しても良い。

<?php
$str = $age >= 20 ? "成人です。" : "未成年です。";
echo $str;
?>

以下のように記述した場合も、処理としては全く同じ結果となる。

<?php
echo $age >= 20 ? "成人です。" : "未成年です。";
?>



PHP, PHP講座, ネット・PCPermalink