为什么in_array(1, array('1:foo'))返回TRUE?

3
如果1不在array()中,代码应该返回FALSE而不是TRUE。你知道为什么吗?
<?php
var_dump(in_array(1,  array('1:foo'))); // TRUE, why?
var_dump(in_array('1',  array('1:foo'))); // FALSE

8
类型强制转换。1 == '1:foo'(因为(int)'1:foo' === 1)。 - knittl
1
你应该查看文档页面。in_array函数需要第三个参数来进行类型敏感检查。 - TonyArra
2个回答

6

正如@knittl已经说过的那样,这是因为类型强制转换。发生了什么:

var_dump(in_array(1,  array('1:foo')));
//PHP is going to try to cast '1:foo' to an integer, because your needle is an int.

将 cast 转换为 (int) '1:foo',结果为整数 1,因此实际上我们得到了这个:

var_dump(in_array(1,  array(1))); //Which is TRUE

第二个语句是错误的。这是因为它们都是相同类型的,PHP不再尝试进行任何转换。当然,“1”和“1:foo”不相同。

var_dump(in_array('1',  array('1:foo'))); //Which is FALSE

1
因为你正在比较“int”和“string”,并且将字符串强制转换为“int” - 由于该字符串的第一个(或任何第一个字符序列)元素是数字,而下一个不是任何整数表示的一部分 - 它会更改为该元素=1。

http://php.net/manual/en/language.types.type-juggling.php

var_dump(in_array(1233,  array('1233:123')));   //also True

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