Как заставить array walk работать со встроенными функциями PHP?


Я просто хочу использовать array_walk() с ceil() для округления всех элементов в массиве. Но это не работает.

Код:

$numbs = array(3, 5.5, -10.5); 
array_walk($numbs, "ceil"); 
print_r($numbs);  

выход должен быть: 3,6,-10

Сообщение об ошибке:

предупреждение: ceil () ожидает ровно 1 параметр, 2 задается в строке 2

выход есть: 3,5.5,-10.5 (то же, что и до использования ceil ())

Я также попробовал с round().

4 7

4 ответа:

У меня была такая же проблема с другой функцией PHP. Вы можете создать "свою собственную функцию ceil". В этом случае очень легко решить:

function myCeil(&$list){  
    $list =  ceil($list);  
}  

$numbs = array(3, 5.5, -10.5);  
array_walk($numbs, "myCeil");  
print_r($numbs);  

Использование array_map вместо этого.

$numbs = array(3, 5.5, -10.5);
$numbs = array_map("ceil", $numbs);
print_r($numbs);

array_walk фактически передает 2 параметра в обратный вызов, и некоторые встроенные функции не любят вызываться с слишком большим количеством параметров (об этом есть примечание на странице docs для array_walk). Это просто предупреждение , хотя это не ошибка.

array_walk также требуется, чтобы первый параметр обратного вызова был ссылкой , если вы хотите, чтобы он изменил массив. Итак, ceil() все еще вызывали для каждого элемент, но так как он не принимал значение в качестве ссылки, он не обновлял массив.

array_map лучше для этой ситуации.

Причина, по которой он не работает, заключается в том, что ceil($param) ожидает только один параметр вместо двух.

Что вы можете сделать:

$numbs = array(3, 5.5, -10.5); 
array_walk($numbs, function($item) {
    echo ceil($item);
}); 

Если вы хотите сохранить эти значения, то используйте array_map, который возвращает массив.

Обновить

Я предлагаю прочитать этот Ответ на stackoverflow, который очень хорошо объясняет различия между array_map, array_walk, и array_filter

Надеюсь, это поможет.

Это потому, что array_walk нужна функция, первый параметр которой является ссылкой &

function myCeil(&$value){
    $value = ceil($value);
}

$numbs = array(3, 5.5, -10.5); 
array_walk($numbs, "myCeil"); 
print_r($numbs);