1

即使比较了解 PHP 的特性,以下奇怪的行为今天仍然让我感到困惑:

// loose
$a = array(true => 'foo');
var_dump(array_key_exists(1, $a));

// strict
$a = array('7.1' => 'foo');
var_dump(array_key_exists('7.10', $a));

我想知道这种效果的技术原因是什么,所以问题是,这个函数背后的过程是什么导致某些类型的值被松散地比较而其他类型的值被严格地比较?我不是在抱怨这种行为,而是试图理解这一点,所以“PHP 糟透了”的评论毫无意义。

4

4 回答 4

3

在您的第一种情况下,布尔值不是有效的数组键,因此在初始化数组时它会立即变为 1,从而使您的搜索匹配。

在第二种情况下,数组键是一个字符串,并且 '7.1' 与 '7.10' 不是同一个字符串

于 2012-08-10T16:45:21.743 回答
1

在此处记录。请注意,键是整数或字符串。文档中提到了特定的键转换,特别是(对于您的情况)将 bool 转换为整数(即​​ true为 1,false为 0)。如其他地方所述,您的其他示例是字符串(删除引号以使其浮动,然后根据文档将其截断为整数)。

于 2012-08-10T16:48:32.977 回答
1

在您的第二个示例中,'7.1'并且'7.10'是字符串。它们作为字符串进行比较,因此它们不匹配。

现在为什么你在第一个例子中有一个匹配项?数组键可以是字符串或整数。Sotrue被转换为整数,其计算结果为1

于 2012-08-10T16:45:52.413 回答
0

也许你可以在那里添加脚本输出?乍一看:布尔值作为数组键?我认为那不会有任何帮助!第二:7.10 与 7.1 不同 - 在 '' 中声明它使其成为字符串....

如果您想将 true 作为键名,则需要将其封装在单引号或双引号中。如果您不了解 PHP 和单/双引号,它将导致内容被视为字符串值而不是布尔整数(真/假)

于 2012-08-10T16:47:41.277 回答