3

何らかの理由で、PHP の関数array_reduce3 番目のパラメーターとして整数のみを受け入れます。この 3 番目のパラメーターは、リダクション プロセス全体の開始点として使用されます。

function int_reduc($return, $extra) {
    return $return + $extra;
}

$arr = array(10, 20, 30, 40);
echo array_reduce($arr, 'int_reduc', 0); //Will output 100, which is 0 + 10 + 20 + 30 + 40

function str_reduc($return, $extra) {
    return $return .= ', ' . $extra;
}

$arr = array('Two', 'Three', 'Four');
echo array_reduce($arr, 'str_reduc', 'One'); //Will output 0, Two, Three, Four

2 番目の呼び出しでは、'One'が整数値 (0) に変換されてから使用されます。

なぜPHPはこれを行うのですか!?

どんな回避策も歓迎...

4

3 に答える 3

4

値を渡さない場合$initial、PHP は値が渡されたと見なし、関数NULLに渡しNULLます。したがって、考えられる回避策はNULL、コードでチェックすることです。

function wrapper($a, $b) {
    if ($a === null) {
        $a = "One";
    }
    return str_reduc($a, $b);
}

$arr = array('Two', 'Three', 'Four');
echo array_reduce($arr, 'wrapper');
于 2009-10-15T12:36:12.663 に答える
2

独自のarray_reduce関数を作成できます。これが私がすぐに打ちのめしたものです:

function my_array_reduce($input, $function, $initial=null) {
  $reduced = ($initial===null) ? $initial : array_shift($input);
  foreach($input as $i) {
    $reduced = $function($reduced, $i);
  }
  return $reduced;
}
于 2009-10-15T12:26:00.793 に答える
2

3番目のパラメーターはオプションです

混合array_reduce(配列$ input、コールバック$ function [、int $ initial]

http://us2.php.net/manual/en/function.array-reduce.phpを参照してください

使用するだけです:

$arr = array('One', 'Two', 'Three', 'Four');
echo array_reduce($arr, 'str_reduc');

先頭のカンマが必要ない場合は、

function str_reduc($return, $extra) {
    if (empty($return))
        return $extra;
    return $return .= ', ' . $extra;
}

もちろん、文字列をコンマで結合するだけの場合は、implodeを使用します

echo implode(", ", $arr);

http://us2.php.net/manual/en/function.implode.phpを参照してください

于 2009-10-15T12:26:22.843 に答える