$key =>$value与PHP的比较


Weird $key => $value comparison with PHP

我遇到了一个奇怪的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"

$key0并与字符串"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说的,