【PHP】論理演算子 – 論理値に対する演算(論理和・論理積・排他的論理和・否定)

【PHP】論理演算子 – 論理値に対する演算(論理和・論理積・排他的論理和・否定)

論理値に対する演算を論理演算と呼びます。

複数論理値を1つの論理値として算出したり、論理値の値を反転することができます。

ここでは、論理演算について解説します。

検証環境

論理演算

論理演算は論理値に対する演算です。

演算結果として、1つの論理値を導き出します。

また、種類があり、2つの論理値から1つの論理値を導き出す『論理和』・『論理積』・『排他的論理和』や論理値の値を反転する『否定』があります。

論理演算子

論理演算子は論理演算の種類を表す記号です。

論理演算子 演算名 処理内容
|| 論理和 2値の一方でも真の場合は真、それ以外は偽。 $a || $b
&& 論理積 2値の両方が真の場合は真、それ以外は偽。 $a && $b
xor 排他的論理和 2値の一方のみ真の場合は真、それ以外は偽。 $a xor $b
! 否定 値が真の場合は偽、偽の場合は真。 !$a

論理和

論理和は『2つの論理値の一方でも真の場合は真、それ以外を偽』とする演算です。

一般的には“または”を使って表現し、“AまたはBが真の場合は真とする”と要約します。

論理和の演算パターンは計4つです。

A B 論理和
true true true
true false true
false true true
false false false

基本構文

左オペランド || 右オペランド

サンプル

<?php

$a = true;
$b = false;

___ih_hl_start
$result = $a || $b;
___ih_hl_end

var_dump($result);

?>
$ php sample.php
bool(true)

6行目の$a || $bで、$a$bの2値に対して論理和の演算を行っています。

論理和はいずれか一方の値でも真の時、真となり、$aが真(true)のため、演算結果は真(true)になりました。

論理積

論理積は『2つの論理値の両方が真の場合は真、それ以外を偽』とする演算です。

一般的には“かつ”を使って表現し、“AかつBが真の場合は真とする”と要約します。

論理積の演算パターンは計4つです。

A B 論理積
true true true
true false false
false true false
false false false

基本構文

左オペランド && 右オペランド

サンプル

<?php

$a = true;
$b = false;

___ih_hl_start
$result = $a && $b;
___ih_hl_end

var_dump($result);

?>
$ php sample.php
bool(false)

6行目の$a && $bで、$a$bの2値に対して論理積の演算を行っています。

論理積は両方の値が真の時、真となりますが、$bが偽(false)のため、演算結果は偽(false)になりました。

排他的論理和

排他的論理和は『2つの論理値のいずれか一方のみ真の場合は真、それ以外を偽』とする演算です。

一般的には“AまたはBのいずれか一方のみ真の場合は真とする”と要約します。

排他的論理和の演算パターンは計4つです。

A B 排他的論理和
true true false
true false true
false true true
false false false

基本構文

左オペランド xor 右オペランド

サンプル

<?php

$a = true;
$b = false;

___ih_hl_start
$result = $a xor $b;
___ih_hl_end

var_dump($result);

?>
$ php sample.php
bool(true)

6行目の$a xor $bで、$a$bの2値に対して排他的論理和の演算を行っています。

排他的論理和は一方の値のみが真の時、真となり、$aのみ真(true)のため、演算結果は真(true)になりました。

否定

否定は『論理値を反転する』演算です。

一般的には『Aが真なら偽とし、Aが偽なら真とする』と要約されます。

否定の演算パターンは計2つです。

A 否定
true false
false true

基本構文

!オペランド

サンプル

<?php

$a = true;

___ih_hl_start
$result = !$a;
___ih_hl_end

var_dump($result);

?>
$ php sample.php
bool(false)

5行目の!$aで、$aに対して否定の演算を行っています。

否定は値を反転し、$aは真(true)のため、演算結果は偽(false)になりました。

応用

論理演算子はオペランドが論理値であれば演算できます。

そのため、比較演算子や複数の論理演算子を組み合わせて任意の式を作成できます。

論理演算子と比較演算子

比較演算の結果を使った論理演算を行うことが可能です。

<?php
 
$x = 99;

___ih_hl_start
$result = $x < 0 || 10 < $x;
___ih_hl_end

var_dump($result);
 
?>
$ php sample.php
bool(true)

5行目の$x < 0 || 10 < $xは2つの比較演算と1つの論理演算により構成されます。

$x < 0$x0より小さいことを表しますが、$x99のため偽となります。

10 < $x$x10より大きいことを表し、$x99のため真となります。

そして、その2つの論理値を||によって論理和演算し、この式の全体的な評価は真となります。

複数の論理演算子

論理演算子の結果を使った論理演算を行うことが可能です。

<?php
 
$x = 99;
$y = 'Hello';

___ih_hl_start
$result = $x < 0 || 10 < $x && $y == 'Hello';
___ih_hl_end
 
var_dump($result);
 
?>
$ php sample.php
bool(true)

6行目は$x < 0 || 10 < $x$y == 'Hello'の演算結果を論理積演算しています。

また、数式と同様に丸括弧(())で演算の優先順位を制御できます。

<?php
 
$x = 99;
$y = 'Hello';

___ih_diff_start
-$result = $x < 0 || 10 < $x && $y == 'Hello';
+$result = ( $x < 0 || 10 < $x ) && $y == 'Hello';
___ih_diff_end
 
var_dump($result);
 
?>
$ php sample.php
bool(true)

演習問題

問題1

任意の値が『900以上かつ999以下』であるかを判定するプログラムを作成してください。
なお、以下の条件を満たすものとします。

  • 任意の値はコマンドライン引数で与える
  • 判定結果はvar_dump関数で出力
$ php practice.php 939
bool(true)

問題2

任意の値が『0より小さいまたは999より大きい』かを判定するプログラムを作成してください。
なお、以下の条件を満たすものとします。

  • 任意の値はコマンドライン引数で与える
  • 判定結果はvar_dump関数で出力
$ php practice.php -123
bool(true)