array_map() returns an array containing
the results of applying the callback
to the corresponding value of array
(and arrays if more arrays are provided)
used as arguments for the callback.
The number of parameters that the callback
function accepts should match the number of arrays
passed to array_map(). Excess
input arrays are ignored. An ArgumentCountError
is thrown if an insufficient number of arguments is provided.
null can be passed as a value to callback
to perform a zip operation on multiple arrays and return an array
whose elements are each an array holding the elements of the input arrays of the same index (see example below).
If only array is provided,
array_map() will return the input array.
array
An array to run through the callback function.
arrays
Supplementary variable list of array arguments to run through the
callback function.
Returns an array containing the results of applying the callback
function to the corresponding value of array
(and arrays if more arrays are provided)
used as arguments for the callback.
The returned array will preserve the keys of the array argument if and only
if exactly one array is passed. If more than one array is passed, the
returned array will have sequential integer keys.
// printout of $c
Array
(
[0] => The number 1 is called uno in Spanish
[1] => The number 2 is called dos in Spanish
[2] => The number 3 is called tres in Spanish
[3] => The number 4 is called cuatro in Spanish
[4] => The number 5 is called cinco in Spanish
)
// printout of $d
Array
(
[0] => Array
(
[1] => uno
)
[1] => Array
(
[2] => dos
)
[2] => Array
(
[3] => tres
)
[3] => Array
(
[4] => cuatro
)
[4] => Array
(
[5] => cinco
)
)
Usually when using two or more arrays, they should be of equal length
because the callback function is applied in parallel to the corresponding
elements.
If the arrays are of unequal length, shorter ones will be extended with empty
elements to match the length of the longest.
An interesting use of this function is to construct an array of arrays,
which can be easily performed by using null
as the name of the callback function
<?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