В чем разница между array_map
, array_walk
и array_filter
. Из документации видно, что вы можете передать функцию обратного вызова для выполнения действия над предоставленным массивом. Но я не вижу особой разницы между ними.
Они выполняют одно и то же?
Из документации видно, что вы можете передать функцию обратного вызова для выполнения действия над предоставленным ...
В чем разница между array_map
, array_walk
и array_filter
. Из документации видно, что вы можете передать функцию обратного вызова для выполнения действия над предоставленным массивом. Но я не вижу особой разницы между ними.
Они выполняют одно и то же?
Из документации видно, что вы можете передать функцию обратного вызова для выполнения действия над предоставленным ...
В чем разница между array_map
, array_walk
и array_filter
. Из документации видно, что вы можете передать функцию обратного вызова для выполнения действия над предоставленным массивом. Но я не вижу особой разницы между ними.
Они выполняют одно и то же?
Могут ли они использоваться взаимозаменяемо?
Буду признателен за помощь с иллюстративным примером, если они вообще отличаются.
array_map
не может изменять значения внутри входных массивов, в то время как array_walk
может; в частности, array_map
никогда не меняет своих аргументов. array_map
не может работать с ключами массива, array_walk
может. array_map
возвращает новый массив, array_walk
возвращает только true
. Следовательно, если вы не хотите создавать массив в результате обхода одного массива, вы должны использовать 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
)
Из документации:
bool array_walk ( array &$array , callback $funcname [, mixed $userdata ] ) <-return bool
array_walk принимает массив и функцию F
и модифицирует его, заменяя каждый элемент x на F(x)
.
array array_map ( callback $callback , array $arr1 [, array $... ] )<-return array
array_map делает то же самое, за исключением того, что вместо модификации на месте он возвращает новый массив с преобразованными элементами.
array array_filter ( array $input [, обратный вызов $callback ] )<- возвращаемый массив
array_filter с функцией F
, вместо преобразования элементов, удалит любые элементы, для которых F(x)
не является истиной
Идея отображения функции на массив данных пришла из функционального программирования. Не следует думать о array_map
как о foreach
цикле, который вызывает функцию для каждого элемента массива (хотя именно так он и реализован). Следует думать, что функция применяется к каждому элементу массива независимо.
Теоретически такие вещи, как отображение функций, можно выполнять параллельно, поскольку функция, применяемая к данным, должна воздействовать ТОЛЬКО на данные, а не на глобальное состояние. Это происходит потому, что array_map
может выбрать любой порядок применения функции к элементам массива (хотя в PHP это не так).
array_walk
, с другой стороны, использует прямо противоположный подход к работе с массивами данных. Вместо того, чтобы обрабатывать каждый элемент отдельно, он использует состояние (&$userdata
) и может редактировать элемент на месте (подобно циклу foreach). Поскольку каждый раз, когда к элементу применяется $funcname
, это может изменить глобальное состояние программы, поэтому требуется единый правильный способ обработки элементов.
Возвращаясь в землю PHP, array_map
и array_walk
почти идентичны, за исключением того, что array_walk
дает вам больше контроля над итерацией данных и обычно используется для "изменения" данных на месте, не возвращая новый "измененный" массив.
array_filter
на самом деле является приложением array_walk
(или array_reduce
), и он, скорее, просто предоставлен для удобства.