第9章 条件で処理を変える

9.7 論理演算子で複数の条件を組み合わせる

これまでの条件式は「もし○○○ならば、×××する」という単一の条件で判断していましたが、条件分岐文の条件式には「もし○○○で、なおかつ△△△ならば、×××する」や「もし○○○か、または△△△ならば、×××する」というように、複数の条件を設定することもできます。
複数の条件を設定する場合には、「論理演算子」を使う必要があります。本節ではこの論理演算子を使った複数条件の設定方法について学習していきましょう。

9.7.1 論理演算子について

論理演算子を使うと、複数の条件を組み合わせて判定することができます。主な論理演算子は表9.7.1に示します。論理演算子が判定するものは、「各条件の判定結果の真偽値」になります。判定方法については次の項から順番に説明していきます。

表 9.7.1:主な論理演算子の種類

「&&とand」、「||とor」は同じ動作になりますが、演算子の処理の優先順位が異なります。英字よりも記号の演算子の方が優先度は高くなります。本テキストでは「記号の演算子」を取り上げて説明を行っていきます。

9.7.2 論理演算子&&を使ってみよう

論理演算子「&&(半角アンパサンド2つ)」は「複数の条件を全て満たしている」と判断したい場合に利用します。
最も少ない条件2つ「条件A && 条件B」の場合を例にすると、条件AもBもtrueの時だけtrueになります。

表 9.7.2:&&条件の演算結果

書式:論理演算子&&を使った条件分岐文

上記の場合、「もしも条件式Aを満たしている、かつ、条件式Bも満たせていれば処理を行う」ということになります。フローチャートで表すと以下の図のようになります。


表 9.7.1:主な論理演算子の種類

論理演算子の&&を条件判定に使ったプログラム

別の画面からの入力データを受け取り、その入力数値が複数の条件を&&で満たすかどうかをWebブラウザにメッセージを表示して確認してみましょう。

ソース・フォルダー: myproj_intro/ch09
パッケージ: andForm.php
アクセスURL:http://localhost/myproj_intro/ch09/andForm.php

andForm.php

ソース・フォルダー: myproj_intro/ch09
パッケージ: logicalOperator1.php
アクセスURL:andForm.phpからの画面遷移でアクセスされる

logicalOperator1.php

実行結果

5をテキストボックスに入力して送信した場合(ifブロック処理結果)

777をテキストボックスに入力して送信した場合(elseブロック処理結果)

解説

今回のプログラムは、データを入力するWeb画面の「andForm.php」と、その画面からのデータを受け取り先の「logicalOperator1.php」の2つのファイルから構成されています。
まずデータを送信元になるandForm.phpは入力フォームを「POST送信」、入力部品としてテキストボックス(部品名:number)と送信ボタンを設定しています。

続いてデータ受信元になるlogicalOperator1.phpで送信元からのデータ判定を行います。
3行目で入力データをスーパーグローバル変数を使って取得し、変数$numに代入しています。

6~11行目が入力数値を判定する条件分岐文になります。
6行目のif文は論理演算子の「&&」を使って2つの条件式を組み合わせています。今回の条件式を言葉で表すと「$numの値が0以上、かつ、10以下」となります。つまりは、変数$numに0~10の範囲の数字が入っていればifブロックの処理を行い、そうでない場合はelseブロックの処理を行うことになります。
7、10行目の処理は判定結果に応じたメッセージを、変数$msgに代入しています。

19行目は判定結果の変数$msgの値を画面に表示するようにしています。

今回の実行結果をフローチャートで表すと以下の図9.7.2ようになります。
$num=5の場合は、「1つ目の条件式0以上、2つ目の条件式10以下両方満たしている」のでifブロックの処理を行い、$num=777の場合は、「1つ目の条件式0以上満たしているが、2つ目の条件式の10以下満たしていない」のでelseブロックの処理を行う結果になります。


図 9.7.2: &&使った複数条件if-else各ブロックを通った際のフローチャート

9.7.3 論理演算子||を使ってみよう

論理演算子「||(半角縦棒2つ)」は「複数の条件のどれか1つでも満たしている」と判断したい場合に利用します。
最も少ない条件2つ「条件A || 条件B」の場合を例にすると、条件AかBのどちらか、もしくは両方trueの時にtrueになります。

表 9.7.3:||条件の演算結果

※どちらか片方を満たせばtrueになるのであれば、両方満たしていても当然trueになります。

書式:論理演算子||を使った条件分岐文

上記の場合、「もしも条件式Aまたは条件式Bの条件、どちらかが満たせていれば処理を行う」ということになります。フローチャートで表すと以下の図のようになります。


図 9.7.3 :論理演算子||を使った条件分岐文のフローチャート

論理演算子の||を条件判定に使ったプログラム

別の画面からの入力データを受け取り、その入力数値が複数の条件を論理演算子「||」で満たすかどうかをWebブラウザにメッセージを表示して確認してみましょう。

ソース・フォルダー: myproj_intro/ch09
パッケージ: orForm.php
アクセスURL:http://localhost/myproj_intro/ch09/orForm.php

orForm.php

ソース・フォルダー: myproj_intro/ch09
パッケージ: logicalOperator2.php
アクセスURL:orForm.phpからの画面遷移でアクセスされる

logicalOperator2.php

実行結果

-5をテキストボックスに入力して送信した場合(ifブロック処理結果)

11をテキストボックスに入力して送信した場合(ifブロック処理結果)

7をテキストボックスに入力して送信した場合(elseブロック処理結果)

解説

今回のプログラムは、データを入力するWeb画面の「orForm.php」と、その画面からのデータを受け取り先の「logicalOperator2.php」の2つのファイルから構成されています。
データ送信元のorForm.phpはデータ送信先が「logicalOperator2.php」に変わっているだけで、前項で作成したandForm.phpと同じになっています。

続いてデータの受信元になるlogicalOperator2.phpで送信元からのデータ判定を行います。このプログラムは前項で作成したlogicalOperator1.phpの6行目の「&&を使って2つの条件式を判定していた」処理を、「||を使って2つの条件式を判定する」処理に変わっているだけです。その違いの部分について説明していきます。

6~11行目が入力数値を判定する条件分岐文になります。
6行目のif文は論理演算子の「||」を使って2つの条件式を組み合わせています。今回の条件式を言葉で表すと「$numの値が0より小さい、または、10より大きい」となります。つまりは、変数$numにマイナスの値か11以上の数字が入っていればifブロックの処理を行い、そうでない場合はelseブロックの処理を行うことになります。
7、10行目の処理は判定結果に応じたメッセージを、変数$msgに代入しています。

今回の実行結果をフローチャートで表すと以下の図9.7.4ようになります。
$num=-5の場合は、「2つ目の条件式10より大きいは満たしていないが、1つ目の条件式0より小さいを満たしている」のでifブロックの処理を行い、$num=11の場合逆に、「1つ目の条件式0より小さいは満たしていないが、2つ目の条件式10より大きいを満たしている」のでifブロックの処理を行います。
$num=7の場合は、「1つ目の条件式0より小さい、2つ目の条件式10より大きいの両方満たしていない」のでelseブロックの処理を行う結果になります。


図 9.7.4: ||使った複数条件if-else各ブロックを通った際のフローチャート

このプログラムの「||」を使った条件を見て気づいたと思いますが、前項で学習した&&の条件を反対にしたような条件になっています。
&&を使って「0以上かつ10以下」の有効範囲をメインにしたのか、「||」を使って「0より小さいまたは10より大きい」の範囲外をメインにして条件分岐を表現したかの違いに過ぎません。
どちらの条件文の記述方法でも問題ありませんが、処理の目的に合わせて使い分けるようにしてみてください。

9.7.4 論理演算子!を使ってみよう

論理演算子「!(ビックリマーク)」は複数条件で使うものではなく、条件の判定結果をひっくり返したい場合に利用します。
「!条件」の場合を例にすると、条件の判定結果がtrueならfalse、逆にfalseならtrueになります。

表 9.7.4:!条件の演算結果

書式:論理演算子!を使った条件分岐文

上記の場合、「もしも条件式の結果がtrueなら、その結果は否定されfalseになるので処理は行われない」か、「もしも条件式の結果がfalseなら、その結果は否定されtrueになるので処理を行う」ということになります。フローチャートで表すと以下の図のようになります。


図 9.7.5 :論理演算子!を使った条件分岐文のフローチャート

論理演算子の!を条件判定に使ったプログラム

普通に条件式を判定した場合の結果と、「!」を使って結果を判定した場合処理の違いをWebブラウザにメッセージを表示して確認してみましょう。

ソース・フォルダー: myproj_intro/ch09
パッケージ: logicalOperator3.php
アクセスURL:http://localhost/myproj_intro/ch09/logicalOperator3.php

logicalOperator3.php

実行結果

解説

7行目で今回の処理で条件分岐文の判定に使う変数$boolに「true」を代入しています。この変数は途中で変更することはないので、最後までtrueを保持します。

変数の準備が終わった後10~21行目で、2つの条件分岐文を記述しています。その違いはif文の条件式を「!」を使っているかいないかです。

変数$boolの値は「true」のため、1つ目の条件式「$bool == true」を満たしているので、trueとなりifブロックの処理を行います。これは実行結果から「◆変数の中身はtrueですね。」が出力されていることで確認できます。
2つ目の条件式は、「!($bool == true)」は条件式「$bool == true」は満たしてtrueですが、「!」で結果を反転させているので「false」となり、elseブロックの処理を行うことになります。これも実行結果から「●変数の中身はfalseですね。」と、変数の値とは逆のメッセージが表示されていてることで確認できます。

今回の「!」を使った条件式の実行結果をフローチャートで表すと以下の図9.7.6ようになります。


図 9.7.6: !を使った条件式elseブロックを通った際のフローチャート

論理演算子!を付ける位置に注意

logicalOperator3.phpでは、「!($bool == true)」という記述がありました。しかし、式にある括弧を外すと行っている処理が異なり、結果が変わる場合があることに注意が必要です。
変数$boolの値がtrueで「!$bool == true」の場合は、変数$boolの値が否定されfalseとなり、trueとは等しくないので式の解がfalseになる、というような処理を行っています。

本節で学習してきたプログラムでは、条件式に1つの論理演算子しか使用していませんでしたが、もっとたくさんの条件式を違う論理演算子で組み合わせることもできます。
例として、このような複雑な「条件式1 && 条件式2 || !(条件式3 && 条件式4)」条件式の組み合わせでも問題ありません。
プログラムで行いたい条件判定を、論理演算子を上手に利用して作成してみてください。

ポイント
  • 論理演算子を利用すると、複数の条件式を組み合わせた結果で判定が行える。
  • 「&&」は全ての条件式が満たされたら処理を行う条件を作りたい場合に利用する。
  • 「||」はどれかの条件式が満たされたら処理を行う条件を作りたい場合に利用する。
  • 「!」は条件の判定結果をひっくり返したい場合に利用する。

NEXT>> 9.8 本章のまとめ