如果 needle 为 0,in_array 返回 true [重复]

Posted

技术标签:

【中文标题】如果 needle 为 0,in_array 返回 true [重复]【英文标题】:in_array returns true if needle is 0 [duplicate] 【发布时间】:2013-05-23 04:06:34 【问题描述】:

我对@9​​87654321@ 函数有疑问。下面的测试返回true

in_array(0, array('card', 'cash'))

怎么可能,怎么预防?

然而

in_array(null, array('card', 'cash'))

返回false

【问题讨论】:

(int) 0 in (int)'card'? LOOSE TYPING...您正在将数字与字符串进行比较,因此字符串将转换为数字,在这种情况下为 0,并且 0 == 0。使用可选的 STRICT 参数 【参考方案1】:

将任何不以数字开头的字符串转换为数字会在 php 中生成0。这正是将0 与某个字符串进行比较时发生的情况。请参阅PHP docs 了解有关如何完成各种类型之间的比较的详细信息。

使用in_array 的第三个参数(设置为true)来避免松散的类型比较。

in_array(0, array('card', 'cash'), true) === false

【讨论】:

好吧,这就是我需要的答案。谢谢!【参考方案2】:

当您在in_array 中进行比较时 string 在比较不兼容的数据类型时转换为 int 这意味着cashcard被转换为0

这都是因为类型转换

你有两个选择

1 .类型转换

in_array(string(0), array('card', 'cash'))) === false;

2 .在 in_array 上使用 third parametertrue,这将匹配数据类型

in_array(0, array('card', 'cash'), true) === false;

见documentation

【讨论】:

哎呀!!回答这个问题有点晚了..【参考方案3】:

您可以通过使用 'strict' 参数来防止它:

var_export(in_array(0, array('card', 'cash'), true));

var_export(in_array(null, array('card', 'cash'), true));

在这两种情况下都返回 false。

来自the docs to in_array()

If the third parameter strict is set to TRUE then the in_array()
function will also check the types of the needle in the haystack.

【讨论】:

【参考方案4】:

答案可以将0 转换为字符串,所以:

in_array((string) 0, array('card', 'cash'))

请记住,0 可以是一些变量,因此强制转换可能会有所帮助。

【讨论】:

以上是关于如果 needle 为 0,in_array 返回 true [重复]的主要内容,如果未能解决你的问题,请参考以下文章

PHP如何检查一个数组内是不是存在指定元素

php in_array函数的使用

PHP语法-该注意的细节

php 判断数组里是不是有某个值

php数组

In_array()函数弱比较