WEBシステムの開発プラットフォーム LIB PHP Framework! 高速でセキュアなフルスクラッチ開発を今すぐ開始できます。

PHP基礎学習

Chapter3. 制御構文と比較演算子

前章までの学習では、変数の代入や関数の呼び出しを行うプログラミングコード「ステートメント」を記述してきました。
これらのステートメントは実行時(ページアクセス時)にコードの記述順に処理されますが、本章ではプログラミングに不可欠な、条件分岐や繰り返しといった
制御構文について学習します。

1. 条件分岐(if)

条件分岐は、与えられた条件に対し真偽を判定し処理を分岐します。
下記のコードは数値$aと$bを比較し、$aが$bより大きい場合のみ、波括弧内の処理を実行します。
$a = 20;
$b = 10;

if ($a > $b) {

echo "判定結果はtrue!";

}
ifに続く括弧内を条件式といい、等号・不等号などの比較演算子を用いて記述します。

判定結果の真偽はbool値で表します。
上記のコードを分解すると、下記のように記述できます。
$a = 20;
$b = 10;
$c = $a > $b;

if ($c) {

echo "判定結果はtrue!";

}
$c には($a > $b)の判定結果としてbool値「true」が代入されます。
ifに続く括弧内は判定済みのbool値「true」となりますので、波括弧内の処理が実行されます。

このように、ifに続く「括弧内の結果」によって、処理が分岐されることを理解しておいて下さい。
ですので、ifに続く括弧内に関数を記述することも可能です。
function useDiscount($price) {
return ($price >= 5000);
}

$total = 8000;

if (useDiscount($total)) {

echo "割引適用!";

}
useDiscount()は、引数$priceが5000以上の場合に、trueを返します。

条件分岐には、trueまたはfalseへ分岐させる二分岐と、多方向へ分岐させる多分岐があります。
二分岐は、「else」に続くに括弧内に、条件判定がfalseの場合の処理を記述します。
$a = 20;
$b = 10;

if ($a > $b) {

echo "判定結果はtrue!";

} else {

echo "判定結果はfalse!";

}

多分岐は、「else if」に続くに括弧内に、それぞれの条件判定がtrueの場合の処理を記述し、
最後の「else」に続くに括弧内に、すべての条件判定がfalseの場合の処理を記述します。
$price = 8000;

if ($price >= 10000) {

echo "30%割引";

} else if ($price >= 8000) {

echo "20%割引";

} else if ($price >= 5000) {

echo "10%割引";

} else {

echo "割引なし";

}

2. 条件分岐(switch)

条件式の比較演算子が等号(イコール)の場合、多分岐にswitch構文を使用できます。
下記の例は、文字列「$rank」がA~Dの場合に、それぞれ別の処理を行います。
$rank = "A";

switch ($rank) {
case "A":
$color = "#ff0000";
echo $color;
break;
case "B":
$color = "#00ff00";
echo $color;
break;
case "C":
$color = "#0000ff";
echo $color;
break;
default:
$color = "#ffffff";
echo $color;
break;
}
$rankの比較対照となる文字列は、上記のようにそれぞれ、case文(case スペース 値 スペース コロン)で記述します。
case文の次行をインデントし、必要な処理を記述していき、最後にbreak文(break セミコロン)で終了させます。

break文の記述がない場合には、次のcaseが実行されますが、そのような見通しの悪い分岐処理は、バグの温床となりえますので、
各caseは、必ずbreak文で終了させるようにしましょう。

また、すべてのcaseに適合しない場合には、default文(デフォルト)が実行されます。
default文の記述がないswitch構文は、結果があいまいになりますので、必ず記述するようにしましょう。

上記の例をif文で記述すると、下記のようになります。
$rank = "A";

if ($rank == "A") {

$color = "#ff0000";
echo $color;

} else if ($rank == "B") {

$color = "#00ff00";
echo $color;

} else if ($rank == "C") {

$color = "#0000ff";
echo $color;

} else {

$color = "#ffffff";
echo $color;

}
「==」比較演算子は「等しい」を表しますが、else if文で、同一変数の条件式を、何度も記述しています。
こういった場合には、switch文に置き換えることで見通しがよくなります。

3. 比較演算子

比較演算子は、等号・不等号の組み合わせで、下表のような比較を表します。
$a == $bイコール型の相互変換をした後で $a が $b に等しい時に true
$a === $bイコール(型比較)$a が $b に等しく、および同じ型である場合に true
$a != $bノットイコール型の相互変換をした後で $a が $b に等しくない場合に true
$a !== $bノットイコール(型比較)$a が $b に等しくない、または $a の型が $b の型に等しくない場合に true
$a <> $b小なり大なり型の相互変換をした後で $a が $b に等しくない場合に true
$a < $b小なり$a が $b より少ない時に true
$a > $b大なり$a が $b より多い時に true
$a <= $b小なりイコール$a が $b より少ないか等しい時に true
$a >= $b大なりイコール$a が $b より多いか等しい時に true

型比較は、変数の値が、文字列か数値かを判定します。
例えば、$aの値が文字列の20と、$bの値が数値の20では、演算子により判定結果が異なります。
$a = "20";
$b = 20;

if ($a == $b) {
echo "$aと$bの値は等しい";
}
if ($a !== $b) {
echo "$aと$bの値は等しが型は等しくない";
}

また、空文字やゼロ判定を、下記のようにシンプルに記述することができます。
$a = "";
$b = 0;

if (!$a) {
echo "$aは空文字";
}
if (!$b) {
echo "$bは0";
}
ノット演算子のみで記述した場合、空文字、ゼロ、nullの場合にtrueとなります。

4. ループ(for)

同一処理の繰り返し(ループ)には、for(フォー)ループ構文を使用します。

for ($n = 1; $n <= 10; $n++) {

echo $n;

}
上記コードを実行すると、波括弧内の処理が繰り返し実行され、1から10までの数字が表示されます。

forループ構文は、forに続く括弧内に、3つの式を記述します。
ループ開始時に、1番目の式が実行されます。 ここには、変数の初期化(初期値の代入)を記述します。
次に、2番目の条件式が判定され、判定結果がtrueの場合に、波括弧内の処理が実行されます。
最後に、3番目の式が実行されます。 ここには、初期化した変数の、インクリメントまたはデクリメントを記述します。

下記の例では、変数「$m」を数値「1」に初期化し、「$m」が12になるまでインクリメントすることで、
月を選択するセレクトボックスを表示しています。
<div class="test">
<select name="month">

<?php for ($m = 1; $m <= 12; $m++) { ?>

<option value="<?= $m ?>"><?= $m ?>月</option>

<?php } ?>

</select>
</div>

下記コードは、無限ループといって、3つの式を空にすることで永遠に処理を実行させています。
$n = 1;

for (; ; ) {
echo "test {$n}";
$n++;
}

ループは、break文を記述することで、終了させることが出来ます。
このような記述は、複雑な処理をシンプルに記述できますが、必ず処理の始めにbreak文を記述し、無限ループにならないように注意してください。
$n = 1;

for (; ; ) {
if ($n >= 100) break;

echo "test {$n}";
$n++;
}

5. ループ(foreach)

配列の繰り返し処理には、foreach(フォーイーチ)ループ構文を使用します。

$array = ["orange", "banana"];

foreach ($array as $value) {

echo $value;

}
上記コードは、配列内の要素を順番に表示します。
foreachに続く括弧内に、配列 スペース as スペース 変数を記述すると、ループごとに配列の要素が変数に代入される仕組みです。

配列のキーを表示させたい場合には、下記のようにforeachに続く括弧内に、配列 スペース as(アズ) スペース キー変数 => バリュー変数を記述します。
$array = [
 "name" => "inoue",
 "tel" => "06-0000-0000",
 "pref" => "Osaka"
 ];

foreach ($array as $k => $v) {
echo "{$k} = {$v}";
}

下記の例では、多次元配列の要素を表示しています。
$array1 = [
 "name" => "inoue",
 "tel" => "06-0000-0000",
 "pref" => "Osaka"
 ];
$array2 = [
 "name" => "suzuki",
 "tel" => "03-0000-0000",
 "pref" => "Tokyo"
 ];
$address = [ $array1, $array2 ];

foreach ($address as $addr) {
echo $addr["name"];
echo $addr["tel"];
echo $addr["pref"];
}

ループは、continue文を記述することで、スキップすることが出来ます。
$array1 = [
 "name" => "inoue",
 "tel" => "06-0000-0000",
 "pref" => "Osaka"
 ];
$array2 = [
 "name" => "suzuki",
 "tel" => "03-0000-0000",
 "pref" => "Tokyo"
 ];
$address = [ $array1, $array2 ];

foreach ($address as $addr) {
if ($addr["name"] == "inoue") continue;
echo $addr["name"];
echo $addr["tel"];
echo $addr["pref"];
}
上記コードでは、名前が「inoue」と「suzuki」の多次元配列をループしていますが、
continue文によって、名前が「inoue」の場合はスキップして、次のループが実行されますので、「suzuki」のみが表示されます。

6. ループ(while)

while(ワイル)ループ構文は、forループ構文をよりシンプルにしたものです。

$n = 1;

while ($n <= 10) {

echo $n;
$n++;

}
上記コードを実行すると、波括弧内の処理が繰り返し実行され、1から10までの数字が表示されます。

while(ワイル)構文は、whileに続く括弧内に、条件式のみを記述します。
条件式の判定結果がtrueの間、波括弧内の処理が、繰り返し実行されます。

whileループと同等の処理は、forループでシンプルに記述出来る為、初歩的なプログラミングで使用する場面は無いかもしれません。

7. ループ(do-while)

do-while(ドゥーワイル)ループ構文は、whileループ構文に似ていますが、
doに続く波括弧内の処理を実行した後に、whileに続く括弧内の条件式が判定されます。

$n = 11;

do {

echo $n;
$n++;

} while ($n <= 10);
do-while(ワイル)構文は、doに続く波括弧内に処理を記述し、whileに続く括弧内に条件式記述、最後にセミコロンで終了します。
上記例では、$nは「11」に初期化されていますが、do-whileループでは判定前に処理が実行されますので、「11」は表示されます。

必ず一度だけ実行されますので、通信処理などで利用されることがありますが、初歩的なプログラミングで使用する場面は無いかもしれません。