関係演算子と条件分岐(if文、switch文)
条件(condition)の仕組みを知る
- 場合に応じた処理をおこなう
- 真(true)・偽(false)という概念のどちらかで評価されるものを、PHPでは「条件」と呼びます。
関係演算子
- 条件をつくるために使う「関係演算子(relational operator)」
演算子 | 式がtrueとなる場合 |
---|---|
== | 右辺が左辺に等しい |
=== | 右辺が左辺に等しく型も等しい |
!= | 右辺が左辺に等しくない |
<> | 右辺が左辺に等しくない |
!== | 右辺が左辺に等しくないか、型が等しくない |
> | 右辺より左辺が大きい |
>= | 右辺より左辺が大きいか等しい |
< | 右辺より左辺が小さい |
<= | 右辺より左辺が小さいか等しい |
関係演算子を使って関係を記述
<?php 5 > 3; //この条件の評価はtrueです 5 < 3; //この条件の評価はfalseです $a == 6; //この条件の評価は変数 $a の値によって異なります(この場合は6に等しい) $a != 6; //この条件の評価は変数 $a の値によって異なります(この場合は6とは異なる)
条件分岐
- 基準で枝分かれするという発想
枝分かれの仕組みは「条件分岐」
- 昼だったら「こんにちは」と表示
- 夜だったら「こんばんわ」と表示
- 18時を基準にする
条件に応じて枝分かれする処理
- 条件:いまの時刻は18時以降である
- 条件を満たす:「こんばんは」と表示
- その意外の場合:「こんにちは」と表示
if文(if statement)
- 「条件」の値(trueまたはfalse)に応じて処理を行う
- このような文を条件判断文(conditional statement)と呼びます
- if文は、条件判断文のひとつ
- 条件に応じて実行する処理を記述
- if文は、「もし、条件xにあてはまるのであれば、Aの処理をする」というように処理を分岐させます
- その条件x を記述するためには関係演算子や論理演算子などを使い、その結果がTRUE(あてはまる)の場合は、Aの処理を実行します
if ( 条件x ) {
条件xがTRUEの場合に実行する処理A
}
※条件xがTRUEの場合処理Aを実行し、そうでない場合は実行されません
- if文の条件を条件式と呼びます
- 条件式は、結果がboolean型のTRUEかFALSEでなければいけません
<?php // 変数$xに10を代入 $x = 10; // 変数$yに10を代入 $y = 10; // $xは$yより小さいか否かを判定 if( $x < $y ) { // $xは$yより小さくない(FALSE)ため、「PHPは、楽しいです!」は出力されません echo 'PHPは、楽しいです!'; }
ifで条件分岐
- if ... else ...
- if ... elseif ... else ...
- if文の別の構文(endifを使う)
if ( 条件x ) {
条件xがTRUEの場合に実行する処理A
} else {
条件xがFALSEの場合に実行する処理B
}
<?php // 変数$xに70を代入(合格点) $x = 70; // 変数$yに80を代入(テストの点) $y = 80; // $y(テストの点)が$x(合格点)より上か否かの判定 if ( $x <= $y ) { echo 'テストは合格!'; } else { echo 'テストは不合格・・・'; }
「いまの時間は18時以降?」の条件を組み立てる
- date関数の最初のパラメータに「G」を指定すると、0~23までの「時」が返されます
- この数値を「変数 $hour」に格納して、時刻が18時を過ぎているかどうかの判断に使います
- if文の()には、この値「 $hour」が、18以上かどうかかを示す条件文($hour >= 18)を記述します
<?php $hour = date( 'G' ); if ( $hour >= 18 ) { echo 'こんばんは'; } else { echo 'こんにちは'; } ?>
三項演算子
条件式 ? 式1 : 式2
- 条件式を評価し、TRUEであれば式1、FALSEであれば式2を返します
<?php // 条件分岐(if) // 三項演算子(条件演算子) $age = 10; /* if ($age > 20) { $message = '大人!'; } else { $message = '子供!'; } */ $message = ($age > 20) ? '大人!' : '子供!'; echo $message;
2種類の論理演算子
- PHPでは論理演算子の「&&」の代わりに「and」、「||」の代わりに「or」を使うこともできます。どちらを使っても同じ意味ですが、結合の優先順位に違いがあります
- PHP: 論理演算子 - Manual
- http://php.net/manual/ja/language.operators.logical.php
<?php // && は = より優先順位が高いので、$x には false が入ります。 $x = true && false; // 以下と同等 $x = (true && false);
<?php // and は = より優先順位が低いので、$x には true が入ります。 $x = true and false; // 以下と同等 ($x = true) and false;
- どちらを使っても構いませんが、混乱しないようにコードの中ではどちらか一方を使うようにしましょう
<?php // 条件分岐(if) // 比較演算子 < > <= >= == != // 論理演算子 &&(AND) ||(OR) !(NOT) $age = 23; if ($age == 20 || $age == 21) { echo '成人式!'; }
PHPで「偽」と扱われるもの
などが「偽(false)」として扱われることに注意しておきましょう。
<?php $x = '0'; if ( $x ) { echo '1番目'; } else { echo '2番目'; }
- 上記のコードでは $x は文字列の "0" なので、「2番目」と出力されます
- 詳しくは以下のドキュメントをご覧ください。
- http://php.net/manual/ja/language.types.boolean.php
switchで条件分岐
- 選択肢の多い処理をすっきり扱う
- ある変数$xが値1ならば、処理A、値2ならば、処理B、値3ならば、処理C・・・」というように処理を分岐させることができます
- switch文では式の値を評価し、caseの後に記述された値と順次比較していきます
- もし一致する値があった場合にはその後に記述された処理を順次処理していきbreakに達したら終了します
- case処理の中に、breakを書かないと、判定がTRUEとなるcaseの処理が実行された後、それ以降のcaseの処理も判定に関係なく、全て通ってしまいます
- 通常は、breakを書くことにより、どこかのcase処理でTRUEとなり、処理がされたら、それ以降のcase処理を行わないようにします
- 「default」には、どれにも当てはまらなかった時の処理を記述します
switch ( 変数または式 ) {
case 値1 :
変数または式の値が値1の場合に実行する処理A
break;
case 値2 :
変数または式の値が値2の場合に実行する処理B
break;
case 値3 :
変数または式の値が値3の場合に実行する処理C
break;
default :
変数または式の値が値1から値3以外の場合に実行する処理D
}
<?php // 条件分岐(switch) $signal = 'red'; switch ($signal) { case 'red': echo '止まれ!'; break; case 'blue': case 'green': echo '進め!'; break; case 'yellow': echo '注意!'; break; default: // 例外処理 break; }
曜日ごとのメッセージ
- 日曜日:今日は定休日です
- 月曜日:9時~22時まで営業
- 火曜日:9時~22時まで営業
- 水曜日:特売日! 7時~24時まで営業
- 木曜日:9時~22時まで営業
- 金曜日:9時~22時まで営業
- 土曜日:12時~20時まで営業
これを「if文」で処理しようとすると「elseif」が多くなり、何に対しての「それ以外は」なのかわかりにくくなります。
選択肢から1つを選ぶ仕組みがあると便利
- 0(日曜日)の場合:「今日は定休日です」と表示
- 1(月曜日)の場合:「9時~22時まで営業」と表示
- 2(火曜日)の場合:「9時~22時まで営業」と表示
- 3(水曜日)の場合:「特売日! 7時~24時まで営業」と表示
- 4(木曜日)の場合:「9時~22時まで営業」と表示
- 5(金曜日)の場合:「9時~22時まで営業」と表示
- 6(土曜日)の場合:「12時~20時まで営業」と表示
「曜日」という基準を使って、当てはまる選択肢の処理を実行すればよい。
条件分岐(曜日番号が) { 0の場合:「今日は定休日です」と表示 3の場合:「12時~20時まで営業」と表示 6の場合:「12時~20時まで営業」と表示 それ以外の場合:「9時~22時まで営業」と表示 }
曜日ごとに挨拶を切り替える
- 「break文」は、「switch文」から抜けるための命令です
<?php switch(曜日番号){ case 0: echo '今日は定休日です'; break; case 3: echo '特売日! 7時~24時まで営業'; break; case 6: echo '12時~20時まで営業'; break; default: echo '9時~22時まで営業'; } ?>
- 実際の記述は、以下のようになります
<?php $w = date ( 'w' ); switch ( $w ) { case 0: echo '今日は定休日です'; break; case 3: echo '特売日! 7時~24時まで営業'; break; case 6: echo '12時~20時まで営業'; break; default: echo '9時~22時まで営業'; } ?>
- 「月曜日」の場合
switch文で「おみくじ」を作る
- 「mt_rand関数」は、指定した範囲の数値をランダムに作成します
- 「mt_rand(1, 5)」と指定すると、1から5までの数値がランダムに作成されます
<?php $a = mt_rand ( 1, 5 ); switch ( $a ) { case 1: echo '大吉'; break; case 2: echo '中吉'; break; case 3: echo '小吉'; break; case 4: echo '吉'; break; default: echo '凶'; } ?>