Как заставить 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(),

7

Решение

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

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

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

Другие решения

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

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

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

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

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

8

Причина этого не в том, что ceil($param) ожидает только один параметр вместо двух.

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

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

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

ОБНОВИТЬ

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

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

2

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

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

$numbs = array(3, 5.5, -10.5);
array_walk($numbs, "myCeil");
print_r($numbs);
2
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector