比較演算子

比較演算子は、その名前が示すように、二つの値を比較します。

表 15-4. 比較演算子

名前 結果
$a == $b 等しい $a が $b に等しい時に TRUE
$a === $b 等しい $a が $b に等しく同じ型でである場合に TRUE (PHP 4 で導入)。
$a != $b 等しくない $a が $b に等しくない場合に TRUE
$a <> $b 等しくない $a が $b に等しくない場合に TRUE
$a !== $b 等しくない $a が $b と等しくないか、同じ型でない場合に TRUE (PHP 4 で導入)。
$a < $b より少ない $a が $b より少ない時に TRUE
$a > $b より多い $a が $b より多い時に TRUE
$a <= $b より少ないか等しい $a が $b より少ないか等しい時に TRUE
$a >= $b より多いか等しい $a が $b より多いか等しい時に TRUE

整数値を文字列と比較する際、文字列が 数値に変換されます 。 数値形式の文字列を比較する場合、それは整数として比較されます。これらの ルールは、 switch 文にも適用されます。

<?php
var_dump
( 0 == "a" ); // 0 == 0 -> true
var_dump ( "1" == "01" ); // 1 == 1 -> true

switch ( "a" ) {
case
0 :
    echo
"0" ;
    break;
case
"a" : // "a" は 0 にマッチするので、決してここにはたどりつきません
    
echo "a" ;
    break;
}
?>

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

表 15-5. さまざまな型の比較

第 1 オペランドの型 第 2 オペランドの型 結果
null または string string NULL を "" に変換し、数値または文字として比較します
bool または null あらゆる型 bool に変換し、 FALSE < TRUE と判断します
object object 組み込みクラスには独自の比較基準が定義されています。それ以外の クラスは比較できません。同じクラスであるかどうかは - プロパティが 同じ値であるかどうかを配列形式で比較(PHP 4)、PHP 5 では ここで説明されています
string , resource または number string , resource または number 文字列やリソースを数値に変換し、算術演算を行います
array array 要素数の少ない配列のほうが小さくなります。オペランド 1 のキーが オペランド 2 に存在しない場合、配列は比較できません。そうでない場合は 個々の要素の値を比較します(以下の例を参照ください)
array あらゆる型 array のほうが常に大きくなります
object あらゆる型 object のほうが常に大きくなります

例 15-2. 一般的な配列の比較

<?php
// 標準の比較演算子を用いて、配列はこのように比較されます
function standard_array_compare ( $op1 , $op2 )
{
    if (
count ( $op1 ) < count ( $op2 )) {
        return -
1 ; // $op1 < $op2
    
} elseif ( count ( $op1 ) > count ( $op2 )) {
        return
1 ; // $op1 > $op2
    
}
    foreach (
$op1 as $key => $val ) {
        if (!
array_key_exists ( $key , $op2 )) {
            return
null ; // uncomparable
        
} elseif ( $val < $op2 [ $key ]) {
            return -
1 ;
        } elseif (
$val > $op2 [ $key ]) {
            return
1 ;
        }
    }
    return
0 ; // $op1 == $op2
}
?>

strcasecmp() , strcmp() 配列演算子 , マニュアルの のセクションも参照してください。

三項演算子

もうひとつの条件演算子として "?:"(あるいは三項)演算子があります。

例 15-3. デフォルト値を設定する

<?php
// 三項演算子の使用例
$action = (empty( $_POST [ 'action' ])) ? 'default' : $_POST [ 'action' ];

// 上記は以下の if/else 式と同じです。
if (empty( $_POST [ 'action' ])) {
    
$action = 'default' ;
} else {
    
$action = $_POST [ 'action' ];
}

?>
(expr1) ? (expr2) : (expr3) という式は、 式1 TRUE の場合に 式2 を、 式1 FALSE の場合に 式3 を値とします。

注意: 三項演算子は式であり、値としては評価されずに式の結果として評価される ことに注意してください。演算結果をリファレンスとして返したい場合に、 これを知っておくことが大切です。結果をリファレンスとして返す関数で return $var == 42 ? $a : $b; とすることはできず、 新しいバージョンの PHP では警告を発生します。

注意: 三項演算子を "積み重ねて" 使用することは避けましょう。 ひとつの文の中で複数の三項演算子を使用した際の PHP の振る舞いは、 少々わかりにくいものです。

例 15-4. 三項演算子のわかりにくい挙動

<?php
// ぱっと見た感じでは、これは 'true' と表示されると思うでしょう。
echo ( true ? 'true' : false ? 't' : 'f' );

// しかし、実際には上の出力結果は 't' です。
// なぜなら、三項演算子は左から右へ順に評価されるからです。

// 上のコードをもう少しわかりやすく書くと、このようになります。
echo (( true ? 'true' : 'false' ) ? 't' : 'f' );

// まず、最初の式が 'true' と評価されます。この 'true' は
// (bool)true と評価されるので、それをもとに二番目の三項
// 演算子が評価されます。
?>