array_map() devuelve un array que contiene
los resultados de la aplicación de la función de devolución de llamada
callback al valor correspondiente de
array (y arrays si se proporcionan
más arrays) utilizados como argumentos para la función de devolución de llamada.
El número de argumentos que la función de devolución de llamada callback
acepta debe corresponder al número de arrays pasados a
array_map().
Los arrays de entrada adicionales son ignorados.
Se lanza una ArgumentCountError si se proporciona un número
insuficiente de argumentos.
La función de devolución de llamada de tipo callable a ejecutar
para cada elemento de cada array.
null puede ser pasado como valor a callback
para ejecutar una operación zip sobre varios arrays y devolver un array
cuyos elementos son cada uno un array que contiene los elementos de los arrays de entrada
con el mismo índice (ver el ejemplo a continuación).
Si solo array es proporcionado,
array_map() devolverá el array de entrada.
array
Un array a ejecutar a través de la función de devolución de llamada callback.
arrays
Lista variable de argumentos de arrays adicionales a ejecutar a través
de la función de devolución de llamada callback.
Devuelve un array que contiene los resultados de la aplicación de la función
de devolución de llamada callback al valor correspondiente de
array (y arrays si se proporcionan
más arrays) utilizados como argumentos para la función de devolución de llamada.
El array devuelto conservará las claves del array pasado como argumento,
si y solo si, se pasa un solo array. Si se pasan varios arrays como argumento,
el array devuelto tendrá claves secuenciales en forma de entero.
// Contenido de $c
Array
(
[0] => El número 1 se dice uno en Español
[1] => El número 2 se dice dos en Español
[2] => El número 3 se dice tres en Español
[3] => El número 4 se dice cuatro en Español
[4] => El número 5 se dice cinco en Español
)
// Contenido de $d
Array
(
[0] => Array
(
[1] => uno
)
[1] => Array
(
[2] => dos
)
[2] => Array
(
[3] => tres
)
[3] => Array
(
[4] => cuatro
)
[4] => Array
(
[5] => cinco
)
)
Generalmente, al utilizar varios arrays, estos deben
tener la misma longitud, ya que la función de devolución de llamada se aplica de manera
similar a todos los arrays. Si los arrays tienen longitudes desiguales,
los más pequeños serán completados con elementos vacíos para alcanzar
la longitud del más grande.
Un uso interesante de esta función es la construcción
de arrays de arrays, fácilmente realizada pasando el valor
null como nombre de función de devolución de llamada.
<?php class MyFilterClass { public function filter(array $arr) { return array_map(function($value) { return $this->privateFilterMethod($value); }); }
private function privateFilterMethod($value) { if (is_numeric($value)) $value++; else $value .= '.'; } } ?>
This will work, because $this inside anonymous function (unlike for example javascript) is the instance of MyFilterClass inside which we called it. I hope this would be useful for anyone.
If you need to rotate rectangular two-dimension array on 90 degree, add the following line before or after (depending on the rotation direction you need) the code above: $array = array_reverse($array);
If the callback function to be called is a static method from a different namespace, the fully qualified method including namespace must be specified (a use statement is not sufficient to resolve the namespace of the callback function)
<?php use MyTools;
$arr = [1, 2, 3];
$arr = array_map('Tools::myHelper', $arr); ?>
will cause TypeError: array_map() expects parameter 1 to be a valid callback, class 'Tools' not found.
Use the fully qualified name for the callback instead:
You may be looking for a method to extract values of a multidimensional array on a conditional basis (i.e. a mixture between array_map and array_filter) other than a for/foreach loop. If so, you can take advantage of the fact that 1) the callback method on array_map returns null if no explicit return value is specified (as with everything else) and 2) array_filter with no arguments removes falsy values.
A general solution for the problem of wanting to know the keys in the callback, and/or retain the key association in the returned array:
<?php
/** * Like array_map() but callback also gets passed the current key as the * first argument like so: * function($key, $val, ...$vals) { ... } * ...and returned array always maintains key association, even if multiple * array arguments are passed. */
Because it uses array_map() directly, it behaves the same way in regard to ignoring the keys of subsequent array arguments. It also has the same variadic signature.
/** * Function which recursively applies a callback to all values and also its * keys, and returns the resulting array copy with the updated keys and * values. * PHP's built-in function array_walk_recursive() only applies the passed * callback to the array values, not the keys, so this function simply applies * the callback to the keys too (hence the need of working with a copy, * as also updating the keys would lead to reference loss of the original * array). I needed something like this, hence my idea of sharing it here. * * @param callable $func callback which takes one parameter (value * or key to be updated) and returns its * updated value * * @param array $arr array of which keys and values shall be * get updated */
function array_map_recursive( callable $func, array $arr ) {
// Initiate copied array which will hold all updated keys + values $result = [];
// Iterate through the key-value pairs of the array foreach ( $arr as $key => $value ) {
// Apply the callback to the key to create the updated key value $updated_key = $func( $key );
// If the iterated value is not an array, that means we have reached the // deepest array level for the iterated key, so in that case, assign // the updated value to the updated key value in the final output array if ( ! is_array( $value ) ) {
$result[$updated_key] = $func( $value );
} else {
// If the iterated value is an array, call the function recursively, // By taking the currently iterated value as the $arr argument $result[$updated_key] = array_map_recursive( $func, $arr[$key] );
}
} // end of iteration through k-v pairs
// And at the very end, return the generated result set return $result;
} // end of array_map_recursive() function definition