奇怪的$ key =>与PHP的$ value比较

时间:2011-12-13 20:21:00

标签: php foreach key-value

我面临一个奇怪的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"

4 个答案:

答案 0 :(得分:6)

$ key 0并与字符串“ id ”进行比较时,字符串(“ id ”)将被转换为整数。由于“ id ”无法转换为有效的整数,转换将产生0,并且if语句变为true。

由于您不希望在两个不兼容的类型之间发生隐式转换,因此请使用===版本更严格的=====将查看变量是否属于同一类型且具有相同的确切值。

 if ($key === "id") {
   ...
 }

文档PHP: Comparison Operators


<强>实施例

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将尝试布尔比较。您可以使用===运算符强制进行类型检查。

您可以参考Type Comparison TablesComparison Operators Table

答案 3 :(得分:-1)

如果您将逻辑表达式设置为考虑vartype

if (key === "id")

如果可行的话。就像@refp说的那样。