PHP中in_array() / array_search()的奇怪行为

5

当我使用PHP函数in_array()时,我发现了一些奇怪的行为。我的数组如下:

$arr = [TRUE, "some string", "something else"];

现在如果我想检查数组中是否有"test",显然没有,但是in_array()仍然返回TRUE,为什么?
$result = in_array("test", $arr);
var_dump($result);  //<b>Output: bool(true)</b>

使用array_search()时会发生同样的事情:
$result = array_search("test", $arr);
var_dump($result);  //Output: int(0)

我认为数组中的TRUE值可能会自动导致函数在未检查数组其余部分的情况下返回TRUE,但我找不到任何文档说明这种非常奇怪的功能。


你能提供一个更完整的代码示例吗?你发布的代码并没有什么帮助。你可能只是犯了一个分配错误或其他错误... - Felix Kling
在运行检查之前,将结果变量赋值给该行。然后我在那行代码后面添加了 die(var_dump($results)),以查看它返回的数组是什么。 - animuson
2个回答

13
这个函数in_array()array_search()的行为并非是一个 bug,而是有文档记录的行为。
这两个函数都有一个可选的第三个参数叫做$strict,默认值为 FALSE:

bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )

mixed array_search ( mixed $needle , array $haystack [, bool $strict = false ] )

这意味着默认情况下这两个函数使用宽松(==)比较来比较值。因此它们只在 PHP 类型转换后检查值是否相同,并忽略类型。由于这个原因,在你的例子中TRUE == "任何非空字符串"求值为 TRUE。
因此,调用函数时将第三个参数设置为 TRUE,表示 PHP 应该使用严格(===)比较,同时比较值和类型。
请参考此链接:PHP 中的等号(== 双等号)和恒等号(=== 三等号)比较运算符有什么区别?

我遇到了这样一种情况,我的in_array函数在使用Python脚本向PHP脚本提交时几乎接受任何变量。这很不寻常,但是这个方法解决了问题。 - Maciek Semik

3

你说得对,布尔值确实可能会导致这种情况。在in_array函数中设置strict标志,这样也会检查元素的类型(基本上与使用===相同):

if (in_array("username", $results, true)) // do something
if (in_array("password", $results, true)) // do something
if (in_array("birthday", $results, true)) // do something

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