Как заставить 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
Надеюсь, это поможет.