我有以下代码:
$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错误吗?
干杯。
答案 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);
会强制进行“严格”检查(即它会对您的变量进行类型检查)。