Какая разница между array_map и array_walk?

147
14 марта 2019, 16:20

Не могу понять какая разница между array_map() и array_walk()?

На php.net написано

array_walk — Применяет заданную пользователем функцию к каждому элементу массива. array_map — Применяет callback-функцию ко всем элементам указанных массивов.

Вся разница только в том, что walk работает с одним массивом, а map может обрабатывать несколько? Тогда какой смысл от array_walk() ? Ведь можно использовать array_map().

Answer 1
  • Изменение значений:
    • array_map не может изменять значения внутри входных массивов, пока array_walk может; в частности, array_map никогда не меняет своих аргументов.
  • Доступ к ключам доступа:

    • array_map не может работать с ключами массива, array_walkможет.
  • Возвращаемое значение:
    • array_map возвращает новый массив, array_walk возвращает true/false. Следовательно, если вы не хотите создавать массив в результате прохождения одного массива, вы должны использовать его array_walk.
  • Итерация нескольких массивов:
    • array_map также может принимать произвольное количество массивов, и он может перебирать их параллельно, а array_walk работает только на одном.
  • Передача произвольных данных в обратный вызов:
    • array_walk может получить дополнительный произвольный параметр для передачи обратного вызова. Это в основном не имеет значения с PHP 5.3 (когда были введены анонимные функции ).
  • Длина возвращаемого массива:
    • Результирующий массив array_map имеет ту же длину, что и наибольший входной массив; array_walk не возвращает массив, но в то же время он не может изменить количество элементов исходного массива; array_filter выбирает только подмножество элементов массива в соответствии с функцией фильтрации. Он сохраняет ключи.

Пример:

<pre>
<?php
$origarray1 = array(2.4, 2.6, 3.5);
$origarray2 = array(2.4, 2.6, 3.5);
print_r(array_map('floor', $origarray1)); // $origarray1 stays the same
// changes $origarray2
array_walk($origarray2, function (&$v, $k) { $v = floor($v); }); 
print_r($origarray2);
// this is a more proper use of array_walk
array_walk($origarray1, function ($v, $k) { echo "$k => $v", "\n"; });
// array_map accepts several arrays
print_r(
    array_map(function ($a, $b) { return $a * $b; }, $origarray1, $origarray2)
);
// select only elements that are > 2.5
print_r(
    array_filter($origarray1, function ($a) { return $a > 2.5; })
);
?>
</pre>

Результат:

Array
(
    [0] => 2
    [1] => 2
    [2] => 3
)
Array
(
    [0] => 2
    [1] => 2
    [2] => 3
)
0 => 2.4
1 => 2.6
2 => 3.5
Array
(
    [0] => 4.8
    [1] => 5.2
    [2] => 10.5
)
Array
(
    [1] => 2.6
    [2] => 3.5
)

Источник

READ ALSO
Как работают поисковые боты?

Как работают поисковые боты?

У меня есть идея написать небольшой поисковик под свои задачи, сделал ряд парсеров для анализа нужных мне сайтов, но их очень быстро банятВозник...

143
PHPExcel кодировка русских символов

PHPExcel кодировка русских символов

Вроде делаю все по инструкции

167
Пагинация на странице Wordpress

Пагинация на странице Wordpress

Подскажите пожалуйста, не могу настроить пагинацию на сайтеСайт самописный, настроил вывод по нужному количеству постов (по 5, а всего их 15) на странице...

170
PHP, phpMyadmin | Как удалить данные из таблицы mySQL

PHP, phpMyadmin | Как удалить данные из таблицы mySQL

Где ошибка в коде? Не выводит nice на странице + не удаляет данные из таблицыКод:

173