我面临一个奇怪的PHP问题。这个简单的例子:
<?php
$array = array(
'zero',
'one',
'id' => 'two'
);
foreach ($array as $key => $value) {
if ($key == "id") {
echo "Key: ". $key .", value: ". $value ."\n";
}
}
?>
应该(imho)输出:
Key: id, value: two
但它输出
Key: 0, value: zero
Key: id, value: two
这怎么可能:0 == "id"
?
答案 0 :(得分:6)
当 $ key 为0
并与字符串“ id ”进行比较时,字符串(“ id ”)将被转换为整数。由于“ id ”无法转换为有效的整数,转换将产生0
,并且if语句变为true。
由于您不希望在两个不兼容的类型之间发生隐式转换,因此请使用===
版本更严格的==
。 ===
将查看变量是否属于同一类型且具有相同的确切值。
if ($key === "id") {
...
}
<强>实施例强>
var_dump (0 == (int)"id");
var_dump ((string)0 == "id");
var_dump (0 === "id");
var_dump (1.0 === 1);
输出
bool(true)
bool(false)
bool(false)
bool(false) # be careful!
答案 1 :(得分:3)
您被一个名为type juggling的过程所困扰。
尝试以下方法:
var_dump(0 == "id");
它将输出bool(true)
。
PHP正在执行整数比较,当它尝试将字符串"id"
转换为整数时,结果为0
。 PHP将愉快地解析字符串的前导数字并停在第一个非数字值,为“123xyz”之类的字符串产生整数123
。由于字符串"id"
中没有前导数字,因此将其解析为整数0
。
解决方案是使用===
,它比较两个变量的值和类型,而不试图兼顾操作数的类型。
答案 2 :(得分:0)
此:
$key == 'id'
...将使PHP进行整数比较,因为左值是一个整数。
如果您想知道为什么:
if ($key) { ... }
...不会给出相同的结果,因为这里的左值(省略)是布尔值,相当于:
if (true == $key) { ... }
因此,PHP将尝试布尔比较。您可以使用===
运算符强制进行类型检查。
答案 3 :(得分:-1)
如果您将逻辑表达式设置为考虑vartype
if (key === "id")
如果可行的话。就像@refp说的那样。