我偶然发现了一些奇怪的东西。假设您有以下数组:
$arr = [0,1,2,3];
// Note the first element is 0
var_dump(in_array('random_string', $arr));
输出:
bool(true)
然而
$arr = [3,1,2,3];
// Note the first element is NOT 0
var_dump(in_array('random_string', $arr))
输出:
bool(false)
这种行为是否有合理的解释?
答案 0 :(得分:2)
我打赌你的字符串被类型变成了一个int(并且因为字符串没有合理的int表示,结果是它转换为0,它匹配第一个元素)
尝试在您用于第一个示例的字符串的开头添加一个数字,并且您会发现它将返回true或false,具体取决于字符串中的数字部分是否在数组中(“ 5个香蕉“将把类型变成5个”
in_array有第三个可选参数,一个布尔值,用于确定是否使用严格模式。如果没有设置或设置为false,那么PHP将键入-juggle the needle以匹配haystack的类型,并且会发生类似这样的问题。如果将其设置为true,则不会发生类型杂乱,而是使用严格比较。这将停止您遇到的问题,但是如果您使用“2”作为针并且[1,2,3]作为草垛,则“2”将不再匹配2并且in_array将返回false。
$arr = [0,1,2,3];
var_dump(in_array('3 banana', $arr)); // true because "3 banana" == 3
var_dump(in_array('5 banana', $arr)); // false because "5 banana" == 5
var_dump(in_array('3 banana', $arr, true)); // false because "3 banana" !== 3
var_dump(in_array('random_string', $arr)); // true because "random_string" == 0
var_dump(in_array('random_string', $arr, true)); // false
var_dump(in_array('3', $arr, true)); // false because "2" !== 2
答案 1 :(得分:1)
这是因为非严格的比较而发生的。你的字符串被转换为整数值" 0",我们可以在第一个数组中看到这个值。
答案 2 :(得分:-1)
实际上in_array返回0和1值,根据你的que,当你检查
时返回1$arr = [0,1,2,3];
var_dump(in_array('random_string', $arr));
和var_dump(in_array('random_string', $arr));
返回数据类型1的布尔值(true),这就是为什么它返回bool(true)和检查时的另一面
$arr = [3,1,2,3];
var_dump(in_array('random_string', $arr))
var_dump(in_array('random_string', $arr));
返回0的数据类型它的布尔值(false)这就是为什么它的返回bool(false)