PHP マニュアル
前のページ | 第 15章演算子 | 次のページ

# 比較演算子

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

表 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 と評価されるので、それをもとに二番目の三項 // 演算子が評価されます。 ?>`

前のページ | ホーム | 次のページ
ビット演算子 | 上に戻る | エラー制御演算子