php array map key value
(PHP 4 >= 4.0.6, PHP 5, PHP 7)
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() со строковыми ключами
Результат выполнения данного примера:
Смотрите также
PHP: array_map и ключи массива
Записная книжка рассеянного [в пространстве и времени] программиста
PHP: array_map и ключи массива
Интересно, почему такой вопрос часто всплывает на форумах или где-то еще?
Сначала постараюсь ответить на вопрос “нафига?”, а потом на вопрос “как?”.
Мы привыкли, что в в питоне, js и множестве других языков и фреймворков есть функция map, которая применяет некоторую функцию-обработчик к каждому элементу в списке данных и возвращающую результат в том же порядке. Пруф.
Но никто не ждал, что хеш-таблица и массив в контексте одного из языков будет означать одно и то же. Опять же пруф.
Этот постыдный момент из жизни структуры привел к тому, что одним из самых частых применений массивов (в пхп конечно же) стало создание отображений категория=>какое-то значение.
А после того как у вас появилось отображение вы, вероятно, захотите это где-нибудь на сгенерированной странице отобразить.
Т.е. показать пользователю сам параметр, а скобках его категорию.
Как мы делаем это в языках (фреймворках), которые разделяют понятие массива и хеш-таблицы? Перебираем объект, который содержит категории и формируем по нему массив выводимых данных. Наверное так.
И тут мы открываем руководство по php и видим, что она применяет некий колбек ко всем элементам массива и после этого возвращает новый массив.
Удобно же! Применили колбек к массиву и получили обработанный.
И что-то не заладилось. 🙂 Ключи в колбек не попадают. Можно сделать все через foreach, но тогда нам потребуется еще одна переменная. А тут все было просто и наглядно.
И мы идем в гугель: “php array_map with keys”.
И все отлично работает. И притом правильно. Относительно конечно же. И никаких вам лишних переменных.
А тем временем в коде вновь и вновь появляются конструкции вида
Проблема кейса из статьи может быть и раздута, но при вчитывании в сотни строк кода более-менее понятными сходу являются только первые два варианта.
Карта массива PHP, включая ключи
есть ли способ сделать что-то вроде этого:
15 ответов
Не с array_map, так как он не обрабатывает ключи.
однако он изменяет массив, заданный как параметр, поэтому это не совсем функциональное программирование (поскольку у вас есть такой вопрос).
вы могли бы написать такую функцию самостоятельно, если бы захотели.
Это, вероятно, самый короткий и простой в рассуждении:
вот мое очень простое, PHP 5.5-совместимое решение:
использование
выход
частичное применение
в случае, если вам нужно использовать функцию много раз с различные массивы, но та же функция отображения, вы можете сделать что-то под названием частичное применение функции (связанные с ‘карринг’), который позволяет передавать только массив данных при вызове:
Примечание: Если ваша сопоставленная функция возвращает такой же ключ для двух разных входов, значение, связанное с позже ключ победит. обратный входной массив и выходной результат array_map_assoc разрешить ранее ключи к победе. (Возвращаемые ключи в моем примере не могут сталкиваться, поскольку они включают ключ исходного массива, который, в свою очередь, должен быть уникальным.)
альтернатива
Ниже приведен вариант выше, который может оказаться более логичным для некоторых, но требует PHP 5.6:
n.b. Alex83690 отметил в комментарии, что с помощью array_replace здесь вместо array_merge сохранит целочисленные ключи. array_replace не изменяет входной массив, поэтому безопасен для функционального кода.
если вы находитесь на PHP 5.3 до 5.5, следующее эквивалентно. Он использует
С php5.3 или более поздняя версия:
на основе ответ eis, вот что я в конечном итоге сделал, чтобы не испортить исходный массив:
ваша техника использования array_map С array_keys хотя на самом деле кажется проще и мощнее, потому что вы можете использовать null в качестве обратного вызова возвращает пары ключ-значение:
вот как я реализовал это в своем проекте.
Я сделал эту функцию, на основе ответ eis:
конечно, вы можете использовать array_values чтобы вернуть именно то, что OP хочет.
я вижу, что не хватает очевидного ответа:
работает точно так же, как array_map. Почти.
на самом деле, это не чисто map Как вы знаете это из других языков. Php очень странный, поэтому он требует некоторых очень странных пользовательских функций, потому что мы не хотим разбивать наш точно сломанный worse is better подход.
на самом деле, это не на самом деле map на всех. Тем не менее, это все еще очень полезно.
первая очевидная разница из array_map, является то, что обратный вызов принимает выходы each() из каждого входного массива вместо одного значения. Вы все еще можете перебирать сразу несколько массивов.
любые другие элементы, кроме тех, кто с ключами 0 и 1 в возвращении обратного вызова игнорируемый.
и, наконец, если лямбда возвращает любое значение, кроме null или массив, он рассматривается как если бы и ключ и значение были опущены, так что:
Внимание:
Имейте в виду, что эта последняя функция-всего лишь остаток предыдущих функций, и она, вероятно, совершенно бесполезна. Опираясь на эту функцию очень обескуражен, так как эта функция будет случайным образом устаревший и неожиданно изменился в будущих выпусках.
примеры:
// TODO: examples, anyone?
мне всегда нравится javascript-вариант карты массива. Самая простая версия этого была бы:
теперь вы можете просто передать ему функцию обратного вызова, как построить значения.
array_map
(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)
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: 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: