Php 将null作为数组_键第二个参数传递

Php 将null作为数组_键第二个参数传递,php,Php,PHP文档声明该值为NULL 但是,当显式传递NULL时,数组_键似乎无法正常工作 例子: 代码 $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 输出

PHP文档声明该值为NULL

但是,当显式传递NULL时,数组_键似乎无法正常工作


例子: 代码

$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或空字符串会产生完全相同的行为(显然)

那么,默认值是多少?


答复 。在检查此函数的C代码时,我的第一个想法是,这在C级别是一个糟糕的实现(通过删除代码很容易修复)


但后来我意识到这实际上是预期的行为,因为他们花了很多时间让你测试数组中的空值。

因为你在搜索空值,所以没有结果可以返回给你:)

很难从PHP手册中推断
搜索值
参数的用法。我需要尝试一个例子

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.
这意味着当在
array\u keys()
中指定
search\u value
时,将根据
search\u value
搜索数组(非键)中的值。如果出现匹配,则返回
搜索值
中该值的键

例子 1:

2:


这里很难解释默认值

这是一种特殊情况,第二个参数的默认值实际上不是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;
  }
  // ....

您可以看到,
search\u value
的默认值是
NULL
,但是如果您指定了
array\u keys
的第二个参数,那么在
zend\u parse\u parameters
之后,
search\u value
将不会是
NULL
,我同意xdazz。但是,通过0似乎有效。不过,别问我怎么做!(和,YMMV。)

返回:

array(6) { [0]=> int(10) [1]=> string(3) "xaa" [2]=> int(12) [3]=> int(13) [4]=> int(14) [5]=> int(15) } 

由于类型转换,由于您传递了int,数组中的所有值都转换为int进行比较,并且由于它们都不是数字字符串,所以转换后它们等于0。将
array\u keys
的第三个参数设置为true将阻止它。这是有意义的。根据这个标记,任何未转换为0的数组值(即数字和以数字开头的字符串)都将被过滤掉。是的,就是这样。(实际上,在阅读你的答案之前,我去看了一下代码)。我首先认为这是一个糟糕的C级实现。但是在仔细检查代码后,我意识到这实际上是预期的行为,否则就无法测试空值。
array(1) {
  [0]=>
  string(6) "second"
}
array(1) {
  [0]=>
  string(6) "fourth"
}
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;
  }
  // ....
$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) }