Как получить 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 ответов


У меня была такая же проблема с другой функцией 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);