我遇到了一个奇怪的PHP问题。这个简单的例子:
<?php
$array = array(
'zero',
'one',
'id' => 'two'
);
foreach ($array as $key => $value) {
if ($key == "id") {
echo "Key: ". $key .", value: ". $value ."'n";
}
}
?>
应该输出如下内容:
Key: id, value: two
但是它输出
Key: 0, value: zero
Key: id, value: two
这怎么可能:0 == "id"
当$key为0
并与字符串"id"进行比较时,字符串("id")将被转换为整数。由于"id"不能转换为有效的整数,转换将产生0
,并且if语句变为真。
由于您不希望在两个不兼容的类型之间发生隐式转换,请使用==
的更严格的===
版本。===
将查看变量是否具有相同的类型和相同的确切值。
if ($key === "id") {
...
}
PHP:比较运算符
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!
你正在被一个叫做类型杂耍的过程所困扰。
尝试以下操作:
var_dump(0 == "id");
输出bool(true)
。
PHP正在执行整数比较,当它试图将字符串"id"
转换为整数时,结果是0
。PHP会很高兴地解析字符串的前导数字,并在第一个非数字值处停止,对于像"123xyz"这样的字符串,生成整数123
。由于字符串"id"
中没有前导数字,因此将其解析为整数0
。
===
,它比较两个变量的值和类型,而不试图改变操作数的类型。
This:
$key == 'id'
…将使PHP进行整数比较,因为左值是一个整数。
如果你想知道为什么:
if ($key) { ... }
…不会给出相同的结果,因为这里的左值(虽然省略了)是布尔值,相当于:
if (true == $key) { ... }
因此,PHP将尝试布尔比较。您可以使用===
操作符强制进行类型检查。
可以参考类型比较表和比较操作符表
如果将逻辑表达式设置为考虑变量
if (key === "id")
if将工作。就像@refp说的,