Методы обхода целочисленного третьего параметра PHP для array_reduce

По той или иной причине array_reduce Функция в PHP принимает только целые числа в качестве третьего параметра. Этот третий параметр используется в качестве отправной точки во всем процессе сокращения:

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

Во втором звонке 'One' конвертируется в целочисленное значение, равное 0, а затем используется.

Почему PHP делает это?

Любые обходные пути приветствуются...

3 ответа

Решение

Если вы не пройдете $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');

Третий параметр является необязательным

смешанный array_reduce (массив $ input, callback $ 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

Вы можете написать свою собственную функцию 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;
}
Другие вопросы по тегам