PHP - 比較演算子

比較演算子

比較演算子は、2つの値を比較します。

$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 > $b (より多い)
$a$b より多い時に TRUE
$a <= $b (より少ないか等しい)
$a$b より少ないか等しい時に TRUE
$a >= $b (より多いか等しい)
$a$b より多いか等しい時に TRUE
$a <=> $b (宇宙船演算子)
$a < $b の場合に -1、$a == $b の場合に 0、$a > $b の場合に 1 を返す。

整数値を文字列と比較したり、比較に数値形式の文字が含まれる場合は、文字列が数値に変換され、数値としての比較を行います。=== あるいは !== による比較では型変換は発生しません。この場合は値だけでなく型も比較します。

<?php
  // Integer
  echo 1 <=> 1; // 0
  echo 1 <=> 2; // -1
  echo 2 <=> 1; // 1
   
  // Float
  echo 1.5 <=> 1.5; // 0
  echo 1.5 <=> 2.5; // -1
  echo 2.5 <=> 1.5; // 1
   
  // 文字列
  echo "a" <=> "a"; // 0
  echo "a" <=> "b"; // -1
  echo "b" <=> "a"; // 1
   
  echo "a" <=> "aa";  // -1
  echo "zz" <=> "aa"; // 1
   
  // 配列
  echo [] <=> [];               // 0
  echo [1, 2, 3] <=> [1, 2, 3]; // 0
  echo [1, 2, 3] <=> [];        // 1
  echo [1, 2, 3] <=> [1, 2, 1]; // 1
  echo [1, 2, 3] <=> [1, 2, 4]; // -1
   
  // オブジェクト
  $a = (object) ["a" => "b"]; 
  $b = (object) ["a" => "b"]; 
  echo $a <=> $b; // 0
   
  $a = (object) ["a" => "b"]; 
  $b = (object) ["a" => "c"]; 
  echo $a <=> $b; // -1
   
  $a = (object) ["a" => "c"]; 
  $b = (object) ["a" => "b"]; 
  echo $a <=> $b; // 1
   
  // 比較するのは値だけではない; キーも一致しなければならない
  $a = (object) ["a" => "b"]; 
  $b = (object) ["b" => "b"]; 
  echo $a <=> $b; // 1
?>
宇宙船演算子

多くの型では、以下の表にしたがって上から順に比較が行われます。

型の比較
第1オペランドの型第2オペランドの型結果
null または stringstring NULL を "" に変換し、数値または文字として比較します。
bool または nullあらゆる型 両辺を bool に変換し FALSE < TRUE と判断します。
objectobject 組み込みクラスには独自の比較基準が定義されています。異なるクラスは比較できません。
string, resource, int, floatstring, resource, int, float 文字列やリソースを数値に変換し、算術演算を行います。
arrayarray 要素数の少ない配列のほうが小さくなります。オペランド1のキーがオペランド2に存在しない場合、配列は比較できません。そうでない場合は個々の要素の値を比較します。
objectあらゆる型object のほうが常に大きくなります。
arrayあらゆる型array のほうが常に大きくなります。

三項演算子

三項演算子は (expr1) ? (expr2) : (expr3) で表します。(expr1) ? (expr2) : (expr3) の式は、「式1」が TRUE の場合に「式2」を、「式1」が FALSE の場合に「式3」を値とします。

<?php
  $num = 1;
  $c = $num >= 0 ? '正' : '負';
    
  echo($c); // 正
?>
三項演算子

三項演算子は式であり、値としては評価されずに式の結果として評価されることに注意してください。そのため、関数の返り値として return $var == 10 ? $a : $b; とした場合、警告が発生します。

Null 合体演算子

Null 合体演算子は (expr1) ?? (expr2) で表します。expr1 が NULL である場合は expr2 と評価され、それ以外の場合は expr1 と評価されます。この演算子は、左側の値が存在しない場合でも notice が発生しません。

<?php
  $num = 1;
  $c = $num ?? '値は null です';
  
  echo($c); // 1
?>
Null 合体演算子

Null 合体演算子は式であり、値としては評価されずに式の結果として評価されることに注意してください。そのため、関数の返り値として return $foo ?? $bar; とした場合、警告が発生します。

また、Null 合体演算子はネストさせることもできます。

<?php
  $foo = null;
  $bar = null;
  $baz = 1;
  $qux = 2;

  echo $foo ?? $bar ?? $baz ?? $qux; // 1
?>
Null 合体演算子

関連記事