如果needle为0,则in_array返回true

时间:2013-05-28 08:50:53

标签: php arrays conditional-statements

我的in_array功能存在问题。以下测试返回true

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

怎么可能无法阻止呢?

然而

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

返回false

4 个答案:

答案 0 :(得分:24)

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

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

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

答案 1 :(得分:7)

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

这都是因为类型转换

您有2个选项

1。输入

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

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

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

请参阅documentation

答案 2 :(得分:2)

您可以使用'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.

答案 3 :(得分:0)

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

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

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