- ベストアンサー
文字列比較の演算子
Perl の世界から PHP にやってまいりました。 Perl では、文字列の比較には専用の演算子がありまして、 str1 eq str2 とすると、二つの文字列が同値かどうか調べられますが、PHP にはこのような演算子はないのでしょうか? www.php.net のマニュアルを見ても、そのような演算子がありません。 == 演算子が使えるものかと <?php $str1 = "this is string" ; $str2 = "this is string" if( $str1 == $str2 ) { echo "two string is same" ; } ?> などを試してみるとうまくいくようですが、www.php.net のマニュアルには「文字列を数値化して比較する」と書いてあり、本当に文字列比較が出来るか確信がもてず…。 結局、文字列を比較したいときには strcmp を呼び出していますが、これは PHP 的には正しいのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
結局、本題に答えていなかったので、付け足します。 > 結局、文字列を比較したいときには strcmp を呼び出していますが、これは PHP 的には正しいのでしょうか? 間違っているわけではないと思いますが、あまり一般的ではないかもしれません。 strcmp を使用して「完全一致」のテストするためには、 if(strcmp($a,$b) === 0) もしくは if(!strcmp($a,$b)) と記述することになります。 個人的には、少し面倒な実装に思えます。 ただ、この場合、型を意識せずに文字列をチェックできるので $a = 1; $a = '1'; でも、if が真を返す利点はあります。 同じ状況で、以下のような比較演算子でチェックすると、if は偽を返します。 if($a === $b) 両辺の変数の型が合わないためです。 確実に「文字列型」だと判っていれば、これでも良いのですけどね。 これを元に、真を返すように改変を加えるとすれば、 if(strval($a) === strval($b)) のように、変数の型を文字列型に統一しなければなりません。 ここまで厳密なチェックを求めるのなら、strcmp を使った方が良いかもしれません。
その他の回答 (2)
- aqucent
- ベストアンサー率39% (78/200)
#1 の方に補足というか蛇足ですが。 > if("1.0"=="1"){ ... は、yes になります。 if("1.0" === "1"){ ... で型の評価も行うため、yes を返さないようになります。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
格別PHPに詳しいというわけではないですが、 PHPで eq に相当する、文字列の等値判定のみに使われる演算子というのはなかったと思います。 その意味では、== が文字列同士の等値の判定に使われます。 ただ、説明にもあるように数値と文字列を対象に使った場合は、数値として比較します。 if(0=="b"){ print "yes"; } #yes と表示される if("0"=="b"){ print "yes"; } #何も表示されない いつも数値化して比較するのであれば if("a"=="b"){ print "yes"; } がyes になるはずですが、そうはなりません。 ただ、 if("1.0"=="1"){ print "yes"; } は、yes になります。 そういう動作が不安な時には、scrcmp を使うのがいいのかもしれません。 >マニュアルには「文字列を数値化して比較する」と書いてあり http://www.php.net/manual/ja/language.operators.comparison.php のことだと思いますが、 「多くの型では、以下の表に(上から順に)したがって比較が行われます。」 とありますので、文字列同士の場合、まず、文字列同士として比較されるので、数値化して比較するは、もう片方が数値の場合だと思われます。
お礼
>文字列同士の場合、まず、文字列同士として比較されるので、数値化して比較するは、もう片方が数値の場合だと思われます。 >if("1.0"=="1"){ >print "yes"; >} >は、yes になります。 ちょっと混乱してます。クォーテーションでくくった「数値」は文字列なのではないのでしょうか…。やっぱり strcmp を使ったほうが安全そうですね。
お礼
BLUEPIXY さんへのお礼にも書きましたが、数値/文字列がどのタイミングで型変換されるか/されないのかが少しわかりづらいように感じます(私だけかもしれませんが)。 私のような未熟者は確実に strcmp したほうがよさげですね…。