PHP函数in_array(...)有什么问题?

5

PHP函数in_array(...)“检查一个值是否存在于数组中”。

但是,我在处理字符串时观察到了非常奇怪的行为(PHP v7.0.3)。以下是代码:

$needle = 'a';
$haystacks = [['a'], ['b'], [123], [0]];
foreach ($haystacks as $haystack) {
    $needleIsInHaystack = in_array($needle, $haystack);
    var_dump($needleIsInHaystack);
}

生成如下输出:
bool(true)
bool(false)
bool(false)
bool(true) <- WHAT?

该函数对于每个字符串$needle返回true,如果$haystack包含一个值为0的元素!这是设计意图吗?还是应该报告为错误?
1个回答

13
如果您不将 in_array 的第三个参数设置为 true,则会使用类型强制转换进行比较。
如果将第三个参数 strict 设置为 TRUE,则 in_array() 函数还会检查 haystack 中的 needle 的类型。
根据 宽松比较规则,实际上 'a' 等于 0,因为 (int)'a' == 0

谢谢你的回答!是的,我没有考虑到'a' == 0true - automatix
而且更疯狂的是:虽然'a' == 0true,但'1' == 0却是false(因为(int) '1'1,而1不等于0)。 - automatix
2
'a' == 0 IS TRUE, 0 == null IS TRUE, null == 'a' IS FALSE. 如果我们用变量替换具体的值,我们会发现这种行为是不合逻辑的:a = bb = cc <> a - automatix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接