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