4

PHP ドキュメントには、array_keys の 2 番目の引数のデフォルト値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 答えは正しいです。この関数の C コードを調べたとき、私が最初に考えたのは、これは C レベルでの不適切な実装であるということでした (コードを削除することで簡単に修正できました)。

しかし、配列内のNULL値をテストできるようにするために多くの問題が発生したため、これは実際には意図された動作であることに気付きました。

4

4 に答える 4

4

ここでデフォルト値を説明するのは難しいです。

これは特殊なケースです。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;
  }
  // ....

ご覧のとおり、デフォルト値はNULLforsearch_valueですが、 の 2 番目のパラメーターを指定した場合array_keys、 afterzend_parse_parametersは でsearch_valueはありませんNULL

于 2012-12-16T11:14:39.633 に答える
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) } 
于 2012-12-16T11:16:57.510 に答える
0

あなたはnullを探しているので、返す結果はありません:)

于 2012-12-16T10:54:53.700 に答える
0

search_valueパラメーターの使用に関して、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.

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"
}
于 2012-12-16T11:11:58.497 に答える