比較演算子とは?
プログラミングは比較演算子から出来ている、といってもよいくらい多用する演算子です。
ある2つの値AとBを比較し、その真偽を返すための演算子を比較演算子といいます。
最初に言っておくと比較演算子で比較するのは「論理型」「整数型」「文字列型」だけにしておきましょう。理由は後程説明します。
比較演算子の一覧
比較演算子 | trueになる条件 |
A == B | AとBの値が等しい |
A != B | AとBの値が等しくない |
A <> B | AとBの値が等しくない ※上記同様 |
A === B | AとBの値とデータ型が等しい |
A !== B | AとBの値かデータ型のどちらかが等しくない |
A < B | Aの値がよりBが小さい |
A <= B | Aの値がよりB以下 |
A > B | Aの値ががBより大きい |
A >= B | Aの値ががB以上 |
A <=> B | 宇宙船演算子(PHP7から)。ABが同じなら0、A>Bなら1、A |
==と===の違い
PHPの==の比較ではかなりあいまいな比較が行われます。
PHPはおせっかいなので、できるだけ同じ値にしてtrueにしようと頑張ります。
このせいでバグや余計な学習コストがかさみ、むしろ余計だったりします。
一方、===は厳密な比較を行うので少しの違いも許しません。PHPのあいまいな挙動を避けるため、できるだけこちらを使うようにした方がよいでしょう。
例として==と===の違いを挙げていきます。
//整数と整数
echo var_dump(10 == 10); //true 値もデータ型も一緒
echo var_dump(10 === 10); //true 値もデータ型も一緒
//整数と文字列①
echo var_dump(10 == "10"); //true データ型が違うがOK
echo var_dump(10 === "10"); //false データ型が違うのでNG
//整数と文字列②
echo var_dump(10 == "10abc"); //true おせっかい変換の典型!abcを削除し10に変換
echo var_dump(10 === "10abc"); //false 値もデータ型も違うのでNG
//整数と論理型
echo var_dump(1 == true); //true 論理型が1に変換されるのでOK
echo var_dump(1 === true); //false データ型が違うのでNG
//整数と浮動小数点①
echo var_dump(10 == 10.0); //true データ型が違うがOK
echo var_dump(10 === 10.0); //false 整数と小数なのでNG
//整数と浮動小数点②指数表現
echo var_dump(10 == 1e1); //true 整数と小数。データ型が違うがOK
echo var_dump(10 === 1e1); //false 整数と小数なのでNG
文字列の比較
比較演算子では文字列の比較もできます。
文字列同士を等号で比較
//文字列同士が同じか?
echo var_dump("りんご" == "りんご"); //true ふつうに文字列も
echo var_dump("りんご" == "リンゴ"); //false さすがに日本語まではおせっかいできない笑
文字列の大小を比較
文字列の大小を比較することもできます。大きさは文字列の並び順で比較されます。前にくるものが小さく、後にくるものほど大きくなります。
並び順は先頭から1文字ずつ文字コードを比較し、小さいものほど前にきます。
echo var_dump("AB1" < "AB2"); //true 数値に変換できない文字列は文字コード順(辞書順)
echo var_dump("AB" < "ABCD"); //true CDがついてる分並び替えると後ろに
echo var_dump("A" < "a"); //true 大文字の方が前
echo var_dump("1" < "A"); //true 英字より数字が前
数値に変換できる文字列は注意!
数値に変換できる文字列はまずは数値変換して比較しようとするので注意が必要です。
//数値に変換できる文字列は・・
echo var_dump("0123" == "123"); //true 同じに…泣。整数に変換してしまう
echo var_dump("0123" < "123"); //false 文字列なら0123の方が先だが・・数値で比較される
※詳細の文字コードの順番が知りたい場合は「ASCIIコード表」を検索して調べてみてください。
浮動小数点の比較
算術演算子の章でも説明しましたが、浮動小数点は比較に向きません。
詳細は割愛しますが、PHPの浮動小数点自体が近似値でデータを保持しているため、比較は常に誤差が生じるものとして、その誤差がいくつ以内ならOKとするというような処理とセットで比較しなければなりません。
配列の比較
比較演算子では配列の比較もできますがやらないほうがよいです。
理由は比較ロジックが難解でわかりにくすぎるので、バグの原因となるからです。
そのロジックとは要素数を比較したあと、その中身をキーごとに検索していって判定するというものです。
これに連想配列や多次元配列などが加わるともう何が何だかわからなくなりそうです。
やらない、と決めて要素数や中に含まれる値などから自分で比較ロジックを作りましょう。
プログラミング言語は文法を完璧に理解した人だけが集まってつくるものではありません。初心者が参加することも多いでしょう。このような難解なルールを持つ記述は使わない方が無難です。
なるべくルールはシンプルに、誰もが理解しやすいコーディングを心がけるべきです。
終わりに
最初に比較演算子を使うのは「論理型」「整数型」「文字列型」だけにしておいたほうが良いと言いましたが、その理由がわかったでしょうか?
比較演算子はプログラミング言語に欠かせない一方で、型によっては使い方にクセがあるものが多いので、きっちり覚えて使いこなしましょう!
コメント