まくまくPHPノート
文字列を比較する (strcmp, strcasecmp)
2012-01-15

文字列の比較には === か strcmp を使用する

PHP では、文字列の比較に == 演算子を使ってはいけません。 必ず === 演算子か、strcmp() を使用するようにします。

== 演算子を使用してしまうと、文字列が数値の形になっている場合に、数値として比較をしてしまいます。 つまり、'1.00''1' が等しいと判断されてしまいます。 '5abc'5 を比較した場合も内部で数値比較するので、同一とみなされます。 一方で、'5abc''5' を比較した場合は、異なると判断されます。 こういった直観的ではない == 演算子を使った文字列比較は避けるべきです。

悪い例

if ('100' == '100') {...}    // true
if ('100' == 100) {...}      // true
if ('100' == '0100') {...}   // true !
if ('100' == '100.0') {...}  // true !
if ('5abc' == 5) {...}       // true !
if ('5abc' == '5') {...}     // false
if ('5.0' == '5') {...}      // true !
if ('5.0' == 5) {...}        // true !

何度も書きますが、文字列の比較をする場合は、===strcmp() を使いましょう。 そうすれば自然な結果が得られます。

よい例

if ('100' === '100') {...}    // true
if ('100' === 100) {...}      // false
if ('100' === '0100') {...}   // false
if ('100' === '100.0') {...}  // false
if ('5abc' === 5) {...}       // false
if ('5abc' === '5') {...}     // false
if ('5.0' === '5') {...}      // false
if ('5.0' === 5) {...}        // false

if (strcmp('100', '100') == 0) {...}    // true
if (strcmp('100', '0100') == 0) {...}   // false
if (strcmp('100', '100.0') == 0) {...}  // false

大文字と小文字を区別しない文字列比較

strcmp の代わりに、strcasecmp を使用すると、大文字と小文字を区別せずに文字列比較を行うことができます。

if (strcasecmp('abc', 'ABC') == 0) {
    print 'Match';
}

strcasecmp() は文字列が等しい場合に 0 を返すことに注意してください。

2012-01-15