将null作为array_keys第二个参数传递

时间:2012-12-16 10:50:15

标签: php

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 值。

4 个答案:

答案 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"
}