PHP array_key_exists - 某些类型松散,另一种类型严格


PHP array_key_exists - loose on some types, strict on another

即使相对了解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 很糟糕"的评论是没有意义的。

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

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

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

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

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

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

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