Разница между array_map, array_walk и array_filter

В чем разница между array_map , array_walk и array_filter . Из документации видно, что вы можете передать функцию обратного вызова для выполнения действия над предоставленным массивом. Но я не вижу особой разницы между ними.

Они выполняют одно и то же?
Из документации видно, что вы можете передать функцию обратного вызова для выполнения действия над предоставленным ...

В чем разница между array_map , array_walk и array_filter . Из документации видно, что вы можете передать функцию обратного вызова для выполнения действия над предоставленным массивом. Но я не вижу особой разницы между ними.

Они выполняют одно и то же?
Из документации видно, что вы можете передать функцию обратного вызова для выполнения действия над предоставленным ...

В чем разница между array_map , array_walk и array_filter . Из документации видно, что вы можете передать функцию обратного вызова для выполнения действия над предоставленным массивом. Но я не вижу особой разницы между ними.

Они выполняют одно и то же?
Могут ли они использоваться взаимозаменяемо?

Буду признателен за помощь с иллюстративным примером, если они вообще отличаются.

361
задан Gras Double 12 April 2017 в 08:22
поделиться

3 ответа

  • Изменение значений:
    • array_map не может изменять значения внутри входных массивов, в то время как array_walk может; в частности, array_map никогда не меняет своих аргументов.
  • Доступ к ключам массива:
  • Возвращаемое значение:
    • 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
)
543
ответ дан 23 November 2019 в 00:15
поделиться

Из документации:

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) не является истиной

.
39
ответ дан 23 November 2019 в 00:15
поделиться

Идея отображения функции на массив данных пришла из функционального программирования. Не следует думать о array_map как о foreach цикле, который вызывает функцию для каждого элемента массива (хотя именно так он и реализован). Следует думать, что функция применяется к каждому элементу массива независимо.

Теоретически такие вещи, как отображение функций, можно выполнять параллельно, поскольку функция, применяемая к данным, должна воздействовать ТОЛЬКО на данные, а не на глобальное состояние. Это происходит потому, что array_map может выбрать любой порядок применения функции к элементам массива (хотя в PHP это не так).

array_walk, с другой стороны, использует прямо противоположный подход к работе с массивами данных. Вместо того, чтобы обрабатывать каждый элемент отдельно, он использует состояние (&$userdata) и может редактировать элемент на месте (подобно циклу foreach). Поскольку каждый раз, когда к элементу применяется $funcname, это может изменить глобальное состояние программы, поэтому требуется единый правильный способ обработки элементов.

Возвращаясь в землю PHP, array_map и array_walk почти идентичны, за исключением того, что array_walk дает вам больше контроля над итерацией данных и обычно используется для "изменения" данных на месте, не возвращая новый "измененный" массив.

array_filter на самом деле является приложением array_walk (или array_reduce), и он, скорее, просто предоставлен для удобства.

89
ответ дан 23 November 2019 в 00:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: