PHP文档指出default value of array_keys second argument NULL 。
但是,当显式传递 NULL 时,array_keys似乎无法正常工作。
码
$a = array(10=>'a', 11=>'b', 12=>'b', 13=>'c', 14=>'c', 15=>'b');
$keys = array_keys($a);
var_dump($keys); //Output 0
$keys = array_keys($a, null);
var_dump($keys); //Output 1
输出
array
0 => int 10
1 => int 11
2 => int 12
3 => int 13
4 => int 14
5 => int 15
array
empty
我认为必须尝试查找值为null的键。
传递false或空字符串会产生完全相同的行为(显然)。
那么,默认值是什么?
xdazz answer is right。在检查这个函数的C代码时,我的第一个问题是这是C级的一个糟糕的实现(并且通过删除代码很容易修复)
但后来我意识到这实际上是预期的行为,因为他们遇到了很多麻烦,使你能够在数组中测试 NULL 值。
答案 0 :(得分:4)
这里很难解释默认值。
特殊情况,第二个参数的默认值实际上不是php NULL
,而是C级NULL
。
深入了解源代码:
PHP_FUNCTION(array_keys)
{
zval *input, /* Input array */
*search_value = NULL, /* Value to search for */
//....
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|zb", &input, &search_value, &strict) == FAILURE) {
return;
}
// ....
您可以看到NULL
的默认值为search_value
,但如果您指定了array_keys
的第二个参数,那么在zend_parse_parameters
后,search_value
不会是NULL
。
答案 1 :(得分:1)
我同意xdazz。然而,似乎传递0的作品。不过不要问我怎么样! (并且,YMMV。)
$a = array(10=>'a', 'xaa'=>'b', 12=>'b', 13=>'c', 14=>'c', 15=>'b');
$keys = array_keys($a, 0);
var_dump($keys); //Output 0
返回:
array(6) { [0]=> int(10) [1]=> string(3) "xaa" [2]=> int(12) [3]=> int(13) [4]=> int(14) [5]=> int(15) }
答案 2 :(得分:0)
由于您正在搜索null,因此没有结果可以回复给您:)
答案 3 :(得分:0)
很难从PHP手册中推断出search_value
参数的使用。我需要尝试一个例子。
If the optional search_value is specified,
then only the keys for **that** value are returned.
Otherwise, all the keys from the input are returned.
这意味着,当search_value
中指定array_keys()
时,将针对search_value
搜索数组(非键)中的值。如果匹配,则返回search_value
中该值的键。
<?
$foo = array('first' => 'my_first',
'second' => 'my_second',
'third' => 'my_third',
'fourth' => null);
$keys = array_keys($foo);
var_dump($keys); //Output 0
$keys = array_keys($foo, 'my_second');
var_dump($keys); //Output 1
$keys = array_keys($foo, null);
var_dump($keys); //Output 2
?>
0:
array(4) {
[0]=>
string(5) "first"
[1]=>
string(6) "second"
[2]=>
string(5) "third"
[3]=>
string(6) "fourth"
}
1:
array(1) {
[0]=>
string(6) "second"
}
2:
array(1) {
[0]=>
string(6) "fourth"
}