这种奇怪的PHP行为是什么原因造成的?

时间:2011-11-23 17:48:13

标签: php arrays types

我有以下代码:

$data = array(); // prep array
$data['aardvark'] = true;

print_r($data); // output array
echo "\n";
var_dump(in_array('zebra', $data));

输出如下:

Array
(
    [aardvark] => 1
)

bool(true)

尽管zebra显然不在数组中。看起来它与PHP的松散类型系统有关。 (bool) 'zebra'true,数组中有true,因此in_array返回true?

我想我可以看到逻辑,但它有缺陷。这是一个PHP错误吗?

干杯。

4 个答案:

答案 0 :(得分:4)

不是错误。你完全正确。要正确找到您要找的内容,您必须这样做:

if (in_array('zebra', $data, true)) {

虽然在同一个数组(字符串和布尔值)中存储不同的数据类型可能很少见。如果要存储的数据不是列表,则最有可能是使用对象。

答案 1 :(得分:3)

你是对的。 in_array()

  

bool in_array(混合$ needle,数组$ haystack [,bool $ strict = FALSE])

如果您希望true也针对该类型进行测试,则必须将第三个参数设置为in_array()。否则会进行宽松的比较

var_dump(in_array('zebra', $data, true));

通常这没有问题,因为(在简洁的设计中)通常所有值都与调用in_array()之前所知的类型相同,因此您可以避免使用不匹配的类型调用它。

答案 2 :(得分:2)

这是因为字符串'zebra'非空,并且PHP将'0'以外的非空字符串解释为true并且因为数组中存在匹配值结果得到true

PHP完成了从字符串到布尔值的转换。要避免此转换,您需要将第三个参数作为true传递给in_array

var_dump(in_array('zebra', $data, true));

答案 3 :(得分:1)

“这不是一个错误,它是一个功能!” =)

尝试执行in_array("zebra", $data, true);会强制进行“严格”检查(即它会对您的变量进行类型检查)。