Diferencia entre array_map, array_walk y array_filter
¿ Cuál es exactamente la diferencia entre array_map
y array_walk
? array_filter
Lo que pude ver en la documentación es que se puede pasar una función de devolución de llamada para realizar una acción en la matriz proporcionada. Pero no parece encontrar ninguna diferencia particular entre ellos.
¿Hacen lo mismo?
¿Se pueden usar indistintamente?
Agradecería su ayuda con un ejemplo ilustrativo si son diferentes.
- Cambiar valores:
array_map
no se pueden cambiar los valores dentro de las matrices de entrada mientrasarray_walk
se pueda; en particular,array_map
nunca cambia sus argumentos.
- Acceso a claves de matriz:
array_map
No puedo operar con las teclas de matriz,array_walk
puedo.- Valor de retorno:
array_map
devuelve una nueva matriz,array_walk
solo devuelvetrue
. Por lo tanto, si no desea crear una matriz como resultado de atravesar una matriz, debe usararray_walk
.- Iterando múltiples matrices:
array_map
También puede recibir un número arbitrario de matrices y puede iterar sobre ellas en paralelo, mientrasarray_walk
opera solo en una.- Pasar datos arbitrarios a la devolución de llamada:
array_walk
puede recibir un parámetro arbitrario adicional para pasar a la devolución de llamada. Esto es prácticamente irrelevante desde PHP 5.3 (cuando se introdujeron las funciones anónimas ).- Longitud de la matriz devuelta:
- La matriz resultante
array_map
tiene la misma longitud que la matriz de entrada más grande;array_walk
no devuelve una matriz pero al mismo tiempo no puede alterar el número de elementos de la matriz original;array_filter
selecciona solo un subconjunto de los elementos de la matriz de acuerdo con una función de filtrado. Conserva las claves.
Ejemplo:
<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>
Resultado:
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
)
La idea de asignar una función a una matriz de datos proviene de la programación funcional. No deberías pensar en array_map
un foreach
bucle que llama a una función en cada elemento de la matriz (aunque así es como está implementado). Se debe pensar que se aplica la función a cada elemento de la matriz de forma independiente.
En teoría, cosas como el mapeo de funciones se pueden realizar en paralelo, ya que la función que se aplica a los datos SÓLO debe afectar a los datos y NO al estado global. Esto se debe a que se array_map
puede elegir cualquier orden en el que aplicar la función a los elementos (aunque en PHP no es así).
array_walk
por otro lado, es exactamente el enfoque opuesto al manejo de matrices de datos. En lugar de manejar cada elemento por separado, utiliza un estado ( &$userdata
) y puede editar el elemento en su lugar (muy parecido a un bucle foreach). Dado que cada vez que se $funcname
aplica un elemento, podría cambiar el estado global del programa y, por lo tanto, requiere una única forma correcta de procesar los elementos.
De vuelta en PHP, array_map
son array_walk
casi idénticos, excepto que array_walk
le brindan más control sobre la iteración de los datos y normalmente se usan para "cambiar" los datos en el lugar en lugar de devolver una nueva matriz "modificada".
array_filter
es realmente una aplicación de array_walk
(o array_reduce
) y más o menos se proporciona por conveniencia.