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