我正在研究一些数据解析代码,而我遇到了以下内容。
$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.
但为什么我在第一个例子中提到的比较将我的字符串转换为整数而不是将整数转换为字符串。
我明白你可以对我的例子进行===
严格比较,但我只是想知道:
答案 0 :(得分:4)
如果我正确地重新调整PHP'强制转换'两个变量到最低可能的类型。 他们称之为类型杂耍。
尝试:var_dump("something" == 0);
例如,那会给你真实的。 。曾经咬过我一次。
更多信息:http://php.net/manual/en/language.operators.comparison.php
答案 1 :(得分:1)
我知道这已经得到了回答和接受,但我想添加一些可能有助于通过搜索找到此内容的人。
当我比较一个PHP数组中的post数组和键时,我遇到了同样的问题,在我的post数组中,我有一个额外的字符串值。
$_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"]
等于"0"
,但发生的事情是当$key = int 0
与$bar = string "other"
进行松散比较时结果是true
为了解决这个问题,我进行了严格的比较,但是当POST数组被定义为$key = int 0
时,需要将$key = string "0"
转换为array("other","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";
}
}
}
如果{bar}数组中有$foo[0]["bar"]="1"
,则结果为"0"
;如果{bar}数组中没有$foo[0]["bar"]="0"
,则结果为"0"
。
请记住,在比较变量时,由于PHP的松散变量输入,您可能无法比较变量。