当前位置: 首页 > 面试题库 >

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

高云瀚
2023-03-14
问题内容

我在使用PHP函数时发现了一些奇怪的行为in_array()。我有一个像这样的数组:

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

现在,如果我要检查"test"数组中是否存在它,显然不是,但是in_array()仍然返回TRUE,为什么呢?

$result = in_array("test", $arr);
var_dump($result);  // **Output: bool(true)**

使用时会发生相同的事情array_search()

$result = array_search("test", $arr);
var_dump($result);  // **Output: int(0)**

我认为也许数组中的值TRUE会自动导致该函数为每个结果返回TRUE,而不检查数组的其余部分,但是我找不到任何文档来表明这种非常奇怪的功能。


问题答案:

函数的这种行为in_array()array_search()不是一个错误,而是有据可查的行为。

这两个函数都有一个名为的第三个可选参数$strict,默认情况下为FALSE:

bool in_array(混合$ needle,array $ haystack [,bool $ strict = FALSE]

混合array_search(混合$ needle,数组$ haystack [,bool $ strict = false]

现在,这意味着默认情况下,两个函数都使用松散(==)比较来比较值。因此,它们仅 PHP类型变戏法 之后
检查值是否相同,而不检查类型。因此,在您的示例中,TRUE == "any none emtpy string"计算结果为TRUE。

因此,通过在调用函数时将第3个参数设置为TRUE,可以说PHP应该使用strict(===)比较,并且在比较时应该检查值和值的类型。



 类似资料:
  • 我有以下代码来解析一个JSON文件: 要处理以下JSON文件: 如果我执行此代码,我将收到以下错误: 所以我开始一步一步地调试应用程序,看看part processing()中的哪个代码部分抛出了这个异常。令人惊讶的是,那里的所有代码都正常执行:没有抛出异常,也没有返回结果I except。 更让我惊讶的是,当我稍微改变第一种方法的代码时,它可以在不产生异常的情况下工作。 我不知道println方

  • 问题内容: 我在GregorianCalendar类中遇到一个奇怪的行为,我想知道我是否真的做得不好。 仅当初始化日期的月份的实际Maximum大于我将日历设置为的月份时,才追加此值。 这是示例代码: 我知道问题是由于日历初始化日期是31天(可能是5月),与设置为2月(28天)的月份混淆了。修复很容易(只需在设置年和月之前将day_of_month设置为1),但是我想知道这确实是想要的行为。有什么

  • 问题内容: 我正在为一个问题而苦苦挣扎,我不明白为什么它不起作用。如何通过将变量传递并转换为? 为什么在顶部代码段中不起作用,但在行下方的底部代码段中起作用? 唯一的区别似乎是添加了一个额外的变量,该变量也被键入为? 问题答案: 该是一种原始类型,同时是一个普通的Java类。您不能在原始类型上调用方法。但是该方法在上可用,如javadoc中所示 有关这些原始类型的更多信息,请参见此处

  • 问题内容: 为什么的到哪里去了? 问题答案: 删除任何字符,并从字符串的开头和结尾。

  • 问题内容: 我认为这是一个正常程序,但这是我得到的输出: 有人可以向我解释一下吗? 问题答案: 这是有据可查的PHP行为,请参阅php.net的foreach页面上的警告。 警告 即使在 foreach 循环之后,仍保留 $ value的 引用和最后一个数组元素。建议通过unset()销毁它。 __ 编辑 尝试逐步了解此处实际发生的情况

  • 问题内容: 我有上面的代码,但我不知道为什么会产生 而不是 非常感谢 问题答案: 使用量词来匹配1个或多个空格,而不是:- 表示匹配0个或多个空格,并且将在每个字符之前匹配一个空字符,并由一个空格代替。