Diferencia entre array_map, array_walk y array_filter

Resuelto asked hace 54 años • 5 respuestas

¿ Cuál es exactamente la diferencia entre array_mapy array_walk? array_filterLo 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.

 avatar Jan 01 '70 08:01
Aceptado
  • Cambiar valores:
    • array_mapno se pueden cambiar los valores dentro de las matrices de entrada mientras array_walkse pueda; en particular, array_mapnunca cambia sus argumentos.
  • Acceso a claves de matriz:
  • array_mapNo puedo operar con las teclas de matriz, array_walkpuedo.
  • Valor de retorno:
  • array_mapdevuelve una nueva matriz, array_walksolo devuelve true. Por lo tanto, si no desea crear una matriz como resultado de atravesar una matriz, debe usar array_walk.
  • Iterando múltiples matrices:
  • array_mapTambién puede recibir un número arbitrario de matrices y puede iterar sobre ellas en paralelo, mientras array_walkopera solo en una.
  • Pasar datos arbitrarios a la devolución de llamada:
  • array_walkpuede 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_maptiene la misma longitud que la matriz de entrada más grande; array_walkno devuelve una matriz pero al mismo tiempo no puede alterar el número de elementos de la matriz original; array_filterselecciona 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
)
Artefacto avatar Aug 07 '2010 22:08 Artefacto

La idea de asignar una función a una matriz de datos proviene de la programación funcional. No deberías pensar en array_mapun foreachbucle 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_mappuede elegir cualquier orden en el que aplicar la función a los elementos (aunque en PHP no es así).

array_walkpor 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 $funcnameaplica 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_mapson array_walkcasi idénticos, excepto que array_walkle 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_filteres realmente una aplicación de array_walk(o array_reduce) y más o menos se proporciona por conveniencia.

Kendall Hopkins avatar Aug 08 '2010 03:08 Kendall Hopkins