Функция array_map() возвращает массив (array), который содержит
результаты обработки callback-функцией значений
массива array,
и значений массивов arrays, если в функцию передали больше одного массива,
которые функция передаёт как аргументы в callback-функцию.
При вызове функции array_map() проверяют, чтобы количество массивов, которое передают в функцию,
совпадало с количеством параметров callback-функции.
Функция проигнорирует лишние входные массивы. При передаче недостаточного количества
аргументов функция выбросит исключение ArgumentCountError.
Значение с типом callable, которое функция вызовет
на каждом элементе в каждом массиве.
При передаче аргумента callback со значением null
функция выполнит с массивами zip-операцию и вернёт массив массивов,
каждый из которых содержит элементы входных массивов с одними и теми же индексами,
как в примере ниже.
Функция array_map() вернёт входной массив,
если передали только аргумент array.
array
Массив, который функция передаст в callback-функцию.
arrays
Дополнительные массивы для обработки
callback-функцией.
Функция возвращает массив, который содержит
результаты обработки callback-функцией значений
массива array,
и значений массивов arrays, если в функцию передали больше одного массива,
которые функция передаёт как аргументы в callback-функцию.
Массив, который вернёт функция, сохранит ключи аргумента-массива,
только если в функцию передали ровно один массив. Массив, который возвращает функция,
будет содержать последовательные целочисленные ключи, если передали больше одного массива.
// Вывод переменной $c
Array
(
[0] => Число 1 по-испански называется uno
[1] => Число 2 по-испански называется dos
[2] => Число 3 по-испански называется tres
[3] => Число 4 по-испански называется cuatro
[4] => Число 5 по-испански называется cinco
)
// Вывод переменной $d
Array
(
[0] => Array
(
[1] => uno
)
[1] => Array
(
[2] => dos
)
[2] => Array
(
[3] => tres
)
[3] => Array
(
[4] => cuatro
)
[4] => Array
(
[5] => cinco
)
)
При обработке двух или большего количества массивов лучше передавать массивы одинаковой длины,
поскольку callback-функция применяется к элементам массивов параллельно, позиции которых соответствуют друг другу.
При обработке массивов разной длины функция расширяет более короткие массивы
элементами с пустыми значениями до размера самого длинного массива.
Функция создаёт массив массивов,
когда вместо названия callback-функции передают значение null.
// Примечание: До версии 7.4.0 анонимные функции записывают длинным, а не коротким синтаксисом $callback = fn(string $k, string $v): string => "$v присвоили версию $k";
array(3) {
[0]=>
string(64) "Первому выпуску присвоили версию v1"
[1]=>
string(64) "Второму выпуску присвоили версию v2"
[2]=>
string(66) "Третьему выпуску присвоили версию v3"
}
<?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