2012-02-13 19 views
6

私はいくつかのデータ解析コードで作業していましたが、私は次のことに出くわしました。奇妙なPHPの文字列整数比較と変換

$line = "100 something is amazingly cool"; 
$key = 100; 

var_dump($line == $key); 

まあ私たちのほとんどは、ダンプがfalseを生み出すことを期待するが、私の驚きにダンプがtrueでした!

私はPHPでそのような型変換があることを理解してください:

$x = 5 + "10 is a cool number"; // as documented on PHP manual 
var_dump($x); // int(15) as documented. 

しかし、なぜ、私は最初の例で説明した方法のような比較は、整数を文字列に変換するのではなく、整数への私の文字列を変換しないで。

は、私はあなたが私の例に===厳密-比較を行うことができますことを理解して、私はちょうど知りたい:

  • この動作に言及するPHPのドキュメントのいずれかの部分がありますか?
  • 誰でもPHPで何が起こっているのか説明できますか?
  • どのようにプログラマがこのような問題を防ぐことができますか?
+0

==数値比較をしていると思いますが、それを数字に変換して数字に変換すると、数値で始まる場合はその数字が使用されます。おそらく、NaNのようなものを返さないならば。 – rubixibuc

+0

私たちのほとんどはこれを期待しています....文字列を整数にキャストするとき(文字列と数値を比較するときに起こります)、PHPは最初に出現する数値以外の数字(この場合は100桁の数字と "何か")の間で停止します。 SO 100は結果値である。 –

+0

http://stackoverflow.com/a/8672423を参照してください – Gumbo

答えて

4

私が正確に想起した場合、PHPは2つの変数を可能な限り低い型に 'キャスト'します。 彼らはそれを型ジャグリングと呼びます。

try:var_dump("something" == 0); たとえば、これはあなたに当てはまります。 。かつて私を噛ませていた。

さらに詳しい情報:http://php.net/manual/en/language.operators.comparison.php

+0

PHPマニュアルはhttp://php.net/manual/en/language.types.type-juggling.phpでタイプジャグリングを説明しています。これは、http://php.net/manualの数字への文字列変換に関するセクションにリンクしています。 /en/language.types.string.php#language.types.string.conversion –

1

私は、これはすでに答えて受け入れられているけど、私は、検索経由でこれを見つける他の人を助けるかもしれない何かを追加したいです。

ポスト配列とPHP配列のキーを比較したとき、同じ問題が発生しました。私のポスト配列では、余分な文字列値がありました。あなたが最後に$foo[0]["bar"]"0"に等しいことが、何が起こっていたこと$key = int 0が緩く$bar = string "other"と比較したときの結果は、この問題を解決するためにtrueだったということであると思うだろう。このことから

$_POST["bar"] = array("other"); 

$foo = array(array("name"=>"foobar")); 

foreach($foo as $key=>$data){ 
    $foo[$key]["bar"]="0"; 
    foreach($_POST["bar"] as $bar){ 
     if($bar==$key){ 
      $foo[$key]["bar"]="1"; 
     } 
    } 
} 

は、私は厳密に比較するが、その後、必要に応じてPOSTアレイは array("other","0");とした場合の $key = string "0"$key = int 0を変換するために、以下が働い:

$_POST["bar"] = array("other"); 

$foo = array(array("name"=>"foobar")); 

foreach($foo as $key=>$data){ 
    $foo[$key]["bar"]="0"; 
    foreach($_POST["bar"] as $bar){ 
     if($bar==="$key"){ 
      $foo[$key]["bar"]="1"; 
     } 
    } 
} 

場合、結果は、$foo[0]["bar"]="1"ましたPOSTバー配列にがあり、POSTバー配列に"0"がない場合は$foo[0]["bar"]="0"でした。

変数を比較すると、PHPの緩やかな変数の入力のために、あなたの思うように変数が比較されない可能性があることに注意してください。

+0

多分それは私のものですが、あなたの例は自分の利益のために複雑すぎます。問題は '$ foo'を通常の配列の中にネストされた連想配列として定義することですが、次に連想配列式'($ key => $ data) 'を使って通常の配列を解析します。データにこのネストを入れなければならない場合は、通常の配列を扱う別のループ内にそのループをネストしないのはなぜですか? –

関連する問題