Обычно при обработке двух или более массивов, они имею одинаковую длину, так как функция обратного вызова применяется параллельно к соответствующим элементам массивов. Если массивы имеют различную длину, самый маленький из них дополняется элементами с пустыми значениями.
Интересным эффектом при использовании этой функции является создание массива массивов, что может быть достигнуто путем использования значения NULL в качестве имени функции обратного вызова.
array_map — Применяет callback-функцию ко всем элементам указанных массивов
Описание
Список параметров
Callback-функция, применяемая к каждому элементу в каждом массиве.
Возвращаемые значения
Примеры
Пример #1 Пример использования array_map()
Пример #2 Использование array_map() вместе с lambda-функцией (начиная с версии PHP 5.3.0)
Пример #3 Пример использования array_map() : обработка нескольких массивов
Результат выполнения данного примера:
Обычно при обработке двух или более массивов, они имеют одинаковую длину, так как callback-функция применяется параллельно к соответствующим элементам массивов. Если массивы имеют различную длину, более короткие из них дополняется элементами с пустыми значениями до длины самого длинного массива.
Интересным эффектом при использовании этой функции является создание массива массивов, что может быть достигнуто путем использования значения NULL в качестве имени callback-функции.
Пример #4 Создание массива массивов
Результат выполнения данного примера:
Если массив-аргумент содержит строковые ключи, то результирующий массив будет содержать строковые ключи тогда и только тогда, если передан ровно один массив. Если передано больше одного аргумента, то результирующий массив будет всегда содержать числовые ключи.
Пример #5 Использование array_map() со строковыми ключами
array_map — Применяет callback-функцию ко всем элементам указанных массивов
Описание
Список параметров
Возвращаемые значения
Возвращённый массив сохранит ключи аргумента массива тогда и только тогда, когда будет передан ровно один массив. Если передано более одного массива, возвращённый массив будет иметь последовательные целочисленные ключи.
Примеры
Пример #1 Пример использования array_map()
Пример #2 Использование array_map() вместе с лямбда-функцией
Пример #3 Пример использования array_map() : обработка нескольких массивов
Результат выполнения данного примера:
Обычно при обработке двух или более массивов, они имеют одинаковую длину, так как callback-функция применяется параллельно к соответствующим элементам массивов. Если массивы имеют различную длину, более короткие из них дополняется элементами с пустыми значениями до длины самого длинного массива.
Интересным эффектом при использовании этой функции является создание массива массивов, что может быть достигнуто путём использования значения null в качестве имени callback-функции.
Пример #4 Выполнение zip операции с массивами
Результат выполнения данного примера:
Пример #5 null callback только с array
Результат выполнения данного примера:
Пример #6 Использование array_map() со строковыми ключами
Результат выполнения данного примера:
Результат выполнения данного примера:
Смотрите также
User Contributed Notes 6 notes
Let’s assume we have following situation:
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.
So for example, provided you have:
To transpose rectangular two-dimension array, use the following code:
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);
Записная книжка рассеянного [в пространстве и времени] программиста
PHP: array_map и ключи массива
Интересно, почему такой вопрос часто всплывает на форумах или где-то еще?
Сначала постараюсь ответить на вопрос “нафига?”, а потом на вопрос “как?”.
Мы привыкли, что в в питоне, js и множестве других языков и фреймворков есть функция map, которая применяет некоторую функцию-обработчик к каждому элементу в списке данных и возвращающую результат в том же порядке. Пруф.
Но никто не ждал, что хеш-таблица и массив в контексте одного из языков будет означать одно и то же. Опять же пруф.
Этот постыдный момент из жизни структуры привел к тому, что одним из самых частых применений массивов (в пхп конечно же) стало создание отображений категория=>какое-то значение.
А после того как у вас появилось отображение вы, вероятно, захотите это где-нибудь на сгенерированной странице отобразить.
Т.е. показать пользователю сам параметр, а скобках его категорию.
Как мы делаем это в языках (фреймворках), которые разделяют понятие массива и хеш-таблицы? Перебираем объект, который содержит категории и формируем по нему массив выводимых данных. Наверное так.
И тут мы открываем руководство по php и видим, что она применяет некий колбек ко всем элементам массива и после этого возвращает новый массив.
Удобно же! Применили колбек к массиву и получили обработанный.
И что-то не заладилось. 🙂 Ключи в колбек не попадают. Можно сделать все через foreach, но тогда нам потребуется еще одна переменная. А тут все было просто и наглядно.
И мы идем в гугель: “php array_map with keys”.
И все отлично работает. И притом правильно. Относительно конечно же. И никаких вам лишних переменных.
А тем временем в коде вновь и вновь появляются конструкции вида
Проблема кейса из статьи может быть и раздута, но при вчитывании в сотни строк кода более-менее понятными сходу являются только первые два варианта.
PHP: Can I get the index in an array_map function?
I’m using a map in php like so:
Is it possible to get the index of the value in the function?
6 Answers 6
Sure you can, with the help of array_keys():
When mapping an anonymous function over an anonymous array, there is no way to access the keys:
array_reduce doesn’t get access to the keys either. array_walk can access keys, but the array is passed by reference, which requires a layer of indirection.
Some solutions are:
Array of pairs
This is bad, since we’re changing the original array. Plus the boilerplate «array()» calls increase linearly with the length of the array:
Temporary variable
We’re acting on the original array, and the boilerplate is constant, but we can easily clobber an existing variable:
One-shot function
We can use function scope to prevent clobbering existing names, but have to add an extra layer of «use»:
Multi-argument one-shot function
We define the function we’re mapping in the original scope to prevent the «use» boilerplate):
New function
The interesting thing to note is that our last one-shot function has a nice, generic signature and looks a lot like array_map. We might want to give this a name and re-use it:
Our application code then becomes:
Indirect Array Walk
When writing the above I’d ignored array_walk since it requires its argument to be passed by reference; however, I’ve since realised that it’s easy to work around this using call_user_func. I think this is the best version so far: