2010-03-19 49 views
12

我最近有一个奇怪的问题,最近我无法理解in_array。 例如关于in_array的一个问题

$a = array('a','b','c'); 
$b = array(1,2,3); 

if (in_array(0,$a)) 
{ 
    echo "a bingo!\n"; 
} 
else 
{ 
    echo "a miss!\n"; 
} 

if (in_array(0,$b)) 
{ 
    echo "b bingo!\n"; 
} 
else 
{ 
    echo "b miss!\n"; 
} 

我跑在我的灯,并得到了

a bingo! 
b miss! 

我阅读手册,并设置第三个参数作为$stricttrue,那么它曾作为expected.But这意味着我总是需要请使用in_array将严格的参数设置为true?建议将不胜感激。

问候

+0

Clear.Thanks all。 – Young 2010-03-19 12:01:53

回答

17

这意味着你必须当你想比较不仅比较值到第三个参数设置为true,而且类型

否则,在进行比较时存在类型转换 - 例如参见String conversion to numbers

由于事实上,in_array没有和严格的只是,你将有=====之间相同差异 - 见Comparison Operators


大多数情况下,这种转换工作正常......但不是在你试图将0与以字母开头的字符串进行比较的情况下:字符串被转换为数字, 0作为值。

1

在第一个例子中,数组$ a中的每个值在转换为数字时都是0.这就是为什么你的第一个例子会产生“宾果”。

如果您知道您依赖于隐式转换,或者您的数据类型相同(例如搜索字符串数组中的字符串),则不必使用strict参数。否则,应该使用strict参数,在比较必须是相同类型的两个值时,应该使用===而不是==。

6

in_array的“默认”模式是使用loose comparison,比如== comparison operator。这意味着0相比是这样的:

如果你比较了一些用细绳或比较涉及数字字符串,那么每个:

var_dump(0 == 'a'); // bool(true) 
var_dump(0 == 'b'); // bool(true) 
var_dump(0 == 'c'); // bool(true) 

现在loose comparison operator ==之前确实比较值使用string conversion to integer字符串被转换为数字,数值进行比较。

而且'a''b''c'都转换为0

var_dump((int) 'a'); // int(0) 
var_dump((int) 'b'); // int(0) 
var_dump((int) 'b'); // int(0) 

但在严格的模式下使用in_array时(设为第三个参数为),一个strict comparison (===)完成,这意味着两值和类型必须相等:

var_dump(0 === 'a'); // bool(false) 
var_dump(0 === 'b'); // bool(false) 
var_dump(0 === 'c'); // bool(false) 

因此wh在严格模式中使用in_array,就可以得到期望的结果:

var_dump(in_array(0, $a, true)); // bool(false)