这是代码,检查输出 - > http://codepad.org/7n7dM54e
<?php
$key = "a";
$array = range("0","7");
echo "array is : \n";
var_dump($array);
echo "key is : $key \n";
echo "in_array result \n";
var_dump(in_array($key,$array)); // why is it true, 'a' is not a "0" string or 0 int
echo "array_search result \n";
var_dump(array_search($key,$array)); // why is it index 0
?>
Run Code Online (Sandbox Code Playgroud)
in_array()并array_search()支持第三个参数设置为的类型安全检查true.不会进行任何转换,并且会将值与原样进行比较,并考虑类型(与===操作员一样).
因此,如果您true在每个函数调用结束时传递,您将获得预期的结果:
// Both should return false
var_dump(in_array($key, $array, true));
var_dump(array_search($key, $array, true));
Run Code Online (Sandbox Code Playgroud)
是的,它绝对是一种类型转换,但不是由in_array()或专门实现的转换array_search().它只不过是==运营商进行的松散比较.
两种方法都调用一个名为的C函数php_search_array().此功能定义于/ext/standard/array.c.以下是前几行中的一些内容:
static void php_search_array(INTERNAL_FUNCTION_PARAMETERS, int behavior) /* {{{ */
{
// ---------- snip ----------
int (*is_equal_func)(zval *, zval *, zval * TSRMLS_DC) = is_equal_function;
// ...
if (strict) {
is_equal_func = is_identical_function;
}
// ---------- snip ----------
}
Run Code Online (Sandbox Code Playgroud)
如果我没有错,is_equal_function你看到那里只是对应于(但实际上可能不是)==运算符,无论数据类型如何,它都进行非常简单的比较.可能会发生类型转换.(同样,is_identical_function对应于===.)
例如,'2abc' == 2是的,但是'2abc' == 3是假的.这是因为比较字符串和整数会导致在比较之前将字符串强制转换为整数.因此将字符串'2abc'转换为int返回2.
因此,就像我在下面所说的那样,当你传递'a'给两个函数时,同样的事情也适用:它被转换为一个整数,结果0存在于返回的数组中range().就像我说的那样,range()无论是将整数还是数字字符串作为参数传递,都会返回一个整数数组(或浮点数).
如果将数字与字符串进行比较或比较涉及数字字符串,则每个字符串将转换为数字,并且数字执行比较.
我认为内部实现in_array()和array_search()默认尝试将针头转换为正在搜索的同类型的数组中的元素的.如果是这种情况,由于range()返回一个整数数组,该字符串'a'将转换为一个整数,0因此将返回两个函数调用的结果.请注意,range()即使将数字作为字符串传递,也会产生整数或浮点数组.