关于PHP的in_array()帮助页面(http://uk.php.net/manual/en/function.in-array.php#106319)的最新评论指出,由于PHP"对变量类型的宽容",会出现一些不寻常的结果,但没有解释为什么会出现这些结果.特别是,我不遵循为什么会发生这种情况:
// Example array
$array = array(
'egg' => true,
'cheese' => false,
'hair' => 765,
'goblins' => null,
'ogres' => 'no ogres allowed in this array'
);
// Loose checking (this is the default, i.e. 3rd argument is false), return values are in comments
in_array(763, $array); // true
in_array('hhh', $array); // true
Run Code Online (Sandbox Code Playgroud)
或者为什么海报认为以下是奇怪的行为
in_array('egg', $array); // true
in_array(array(), $array); // true
Run Code Online (Sandbox Code Playgroud)
(当然'egg'确实出现在数组中,PHP并不关心它是一个键还是一个值,并且有一个数组,并且PHP不关心它是否为空?)
任何人都可以提供任何指示..?
763 == true,因为true等于不为0,NULL或''的任何东西,对于数组来说也是一样,因为它是一个值(不是对象)。
为了避免这个问题,您应该将第三个参数传递为TRUE来表示STRICT,因此is_rray将执行===这是一个类型相等的操作,因此
第763章
而且array()!== true也不会
在内部,您可以认为基本的 in_array() 调用的工作方式如下:
function in_array($needle, $haystack, $strict = FALSE) {
foreach ($haystack as $key => $value) {
if ($strict === FALSE) {
if ($value == $needle) {
return($key);
}
} else {
if ($value === $needle) {
return($key);
}
}
return(FALSE);
}
Run Code Online (Sandbox Code Playgroud)
请注意,它使用比较运算符==- 该运算符允许类型转换。因此,如果您的数组包含一个简单的布尔TRUE值,那么基本上您使用 in_array 搜索的所有内容都会被找到,并且除了 PHP 中的以下内容之外的几乎所有内容都可以被类型转换为 true:
'' == TRUE // false
0 == TRUE // false
FALSE == TRUE // false
array() == TRUE // false
'0' == TRUE // false
Run Code Online (Sandbox Code Playgroud)
但:
'a' == TRUE // true
1 == TRUE // true
'1' == TRUE // true
3.1415926 = TRUE // true
etc...
Run Code Online (Sandbox Code Playgroud)
这就是为什么 in_array 有可选的第三个参数来强制进行严格比较。它只是让 in_array 进行===严格比较,而不是==.
意思就是
'a' === TRUE // FALSE
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
175 次 |
| 最近记录: |