比較演算子 : PHP

Pocket

PHPの比較についての覚書。

PHPの比較演算子は値のみを比較す等値演算子(==, !=)、型と値を比較する同値演算子(===,!==)の2つがある。

比較演算子

比較演算子を表にまとめる。

演算子 種類 <>意味
== 等値 値が等しい
!=(<>) 等値 値が等しくない
=== 同値 型も値も等しい
!== 同値 型も値も等しくない

等値演算子(==, !=)

異なる型を等値演算子で比較する場合はPHPが同じ型に(暗黙で)自動変換して値を比較する。変換規則は以下のとおりである。

数値と文字列の比較 ⇒ 文字列を数字へ変換する。

数値と文字列の比較は文字列を数字に変換して数字同士を比較する。

  1. アルファベットなど数字に変換できない値との比較はは常にFALSEとなる。
  2. 空文字””は0へ変換される。
  3. 空文字””と文字”0″の比較は文字列と文字列の比較なのでFALSEになる。空文字””と数字0の比較は空文字””を0に変換するのでTRUEになる。

論理値と数値 ⇒ 数字を論理値へ変換する

論理値と数値の比較は数値の0以外(負数も含む)をTUREに変換して0をFALSEへ変換する[1]

論理値と文字列 ⇒ 文字列を論理値へ変換する

“0”と空文字””はFALSEへ変換する。それ以外はTRUEへ変換する。

$a = 100; $b = “100”; => “100”が数字100へ変換されTRUE
$a = “”; $b = “0” => 文字列と文字列の比較のためFALSE
$a = “”; $b = 0; => 数字と文字列の比較のため””は0へ変換されTRUE

同値演算子(===, !==)

型は自動変換されず、値も型も等しい場合にTRUE。
つまり$a = 100; $b = “100”; => $a===$bは型が異なるためFALSEとなる。

注意すべき等値(==)演算子

  “” “0” 0 NULL 未定義 array()
“” TRUE FALSE TRUE TRUE TRUE FALSE
“0” FALSE TRUE TRUE FALSE FALSE FALSE
0 TRUE TRUE TRUE TRUE TRUE FALSE
NULL TRUE FALSE TRUE TRUE TRUE TRUE
未定義 TRUE FALSE TRUE TRUE TRUE TRUE
array() FALSE FALSE FALSE TRUE TRUE TRUE

■注意すべき同値(===)演算子

  “” “0” 0 NULL 未定義 array()
“” TRUE FALSE FALSE FALSE FALSE FALSE
“0” FALSE TRUE FALSE FALSE FALSE FALSE
0 FALSE FALSE TRUE FALSE FALSE FALSE
NULL FALSE FALSE FALSE TRUE TRUE FALSE
未定義 FALSE FALSE FALSE TRUE TRUE FALSE
array() FALSE FALSE FALSE FALSE FALSE TRUE

» http://php.benscom.com/manual/ja/types.comparisons.php

型の判定

型はgettype関数で取得できる。たとえばかきのようにフォームに設定した値は文字列(string)となる。

<select name="year">
for ($y=2011; $y<2020; $y++) {
    echo '<option value="' . $year . '" selected="selected">' . $year. '</option>';
}
</select>
$year = $_POST['year']
print(gettype($year));  // --- string

追記 2011.06.29 gettypeは推奨されていない。代わりに下記の関数で型を調べる。

is_array() - 変数が配列かどうかを検査する
is_bool() - 変数が boolean であるかを調べる is_float() - 変数の型が float かどうか調べる is_int() - 変数が整数型かどうかを検査する is_null() - 変数が NULL かどうか調べる is_numeric() - 変数が数字または数値形式の文字列であるかを調べる is_object() - 変数がオブジェクトかどうかを検査する is_resource() - 変数がリソースかどうかを調べる is_scalar() - 変数がスカラかどうかを調べる is_string() - 変数の型が文字列かどうかを調べる

» http://php.net/manual/ja/function.gettype.php

[1] javascriptとは異なる。Javascriptの場合はTRUEが1へFALSEが0へ変換され数字同士の比較となる。

コメント

No comments yet.

コメントの投稿

改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。