Что такое код array_map

Содержание

Что такое код array_map

(PHP 4 >= 4.0.6, PHP 5)

array_map — Применить функцию обратного вызова ко всем элементам указанных массивов

Описание array array_map ( mixed callback, array array1 [, array array2. ] )

Функция array_map() возвращает массив, содержащий элементы всех указанных массивов после их обработки функцией обратного вызова. Количество параметров, передаваемых функции обратного вызова, должно совпадать с количеством массивов, переданным функции array_map() .

Пример 1. Пример использования array_map()

function cube($n) <
return $n*$n*$n;
>

$a = array(1, 2, 3, 4, 5);
$b = array_map(«cube», $a);
print_r($b);

В результате переменная $b будет содержать:

Array ( [0] => 1 [1] => 8 [2] => 27 [3] => 64 [4] => 125 )

Пример 2. Пример использования array_map() : обработка нескольких массивов

function show_Spanish($n, $m) <
return «Число $n по-испански — $m»;
>

function map_Spanish($n, $m) <
return array ($n => $m);
>

$a = array(1, 2, 3, 4, 5);
$b = array(«uno», «dos», «tres», «cuatro», «cinco»);

$c = array_map(«show_Spanish», $a, $b);
print_r($c);

$d = array_map(«map_Spanish», $a , $b);
print_r($d);

Результат выполнения:

// printout of $c Array ( [0] => Число 1 по-испански — uno [1] => Число 2 по-испански — dos [2] => Число 3 по-испански — tres [3] => Число 4 по-испански — cuatro [4] => Число 5 по-испански — cinco ) // printout of $d Array ( [0] => Array ( [1] => uno ) [1] => Array ( [2] => dos ) [2] => Array ( [3] => tres ) [3] => Array ( [4] => cuatro ) [4] => Array ( [5] => cinco ) )

Обычно при обработке двух или более массивов, они имею одинаковую длину, так как функция обратного вызова применяется параллельно к соответствующим элементам массивов. Если массивы имеют различную длину, самый маленький из них дополняется элементами с пустыми значениями.

Интересным эффектом при использовании этой функции является создание массива массивов, что может быть достигнуто путем использования значения NULL в качестве имени функции обратного вызова.

Пример 3. Создание массива массивов

$a = array(1, 2, 3, 4, 5);
$b = array(«one», «two», «three», «four», «five»);
$c = array(«uno», «dos», «tres», «cuatro», «cinco»);

$d = array_map(null, $a, $b, $c);
print_r($d);

Результатом выполнения вышеприведенной программы будет:

Array ( [0] => Array ( [0] => 1 [1] => one [2] => uno ) [1] => Array ( [0] => 2 [1] => two [2] => dos ) [2] => Array ( [0] => 3 [1] => three [2] => tres ) [3] => Array ( [0] => 4 [1] => four [2] => cuatro ) [4] => Array ( [0] => 5 [1] => five [2] => cinco ) )

что такое Array.map(Function.call, Number)

Почему вывод map1 равен [0,1,2,3], что делает эта функция отображения?

Array.prototype.map вызывает функцию, предоставляемую для каждого члена массива, и возвращает новый массив возвращаемых значений.

В этом случае предусмотренная функция — Function.call .

Второй аргумент в Array.prototype.map указывает контекст, в котором должна выполняться предоставленная функция.

В этом случае контекст представляет собой Number .

Наивная реализация Array.prototype.map может выглядеть примерно так:

Теперь этот конкретный случай использует много косвенных ссылок, поэтому нелегко понять, почему передача Function.call и Number должна возвращать [0, 1, 2, 3] , поэтому позволяет пройти через эту часть.

Когда callback ( Function.call ) вызывается в контексте thisArg ( Number ), код будет выполнять что-то в соответствии с строками:

Оценка Function.call.call(. ) — это немного изгиб, но это означает call функции call в контексте первого параметра, который должен быть функцией. В нашем случае это так. Это функция Number .

Затем мы упростим это утверждение следующим образом:

Функция Number преобразует первый параметр в число. Другие параметры игнорируются вместе с контекстом функций. Это означает, что все выражение можно упростить до:

Поэтому возвращаемое значение равно [0, 1, 2, 3] , так как это индексы из исходного массива.

Разумеется, исходный образец кода не является чем-то, что должно использоваться в повседневном программировании. Вся система была бы проще в использовании:

и даже тогда следует отметить, что исходные ценности выбрасываются бесполезно. Такие примеры кода полезны только в академическом смысле изучения поведения определенного языка или когда вы намеренно путаете своих друзей как часть проблемы с кодированием.

Ознакомьтесь с использованием карты Array # здесь

Входные аргументы — это map(callback, this)

В вашем примере вы предоставляете функцию Function.call как mapper, которая является конструктором для Function . Функция — это основной способ сказать «запустить эту функцию», и this вы обязуетесь, чтобы дать ей первый аргумент.

Там, где это становится интересным, обратный вызов, который вы ему даете, принимает args (currentValue, index) . Пройдя через Function.call и привязывая его, вы на самом деле вынуждаете его отказаться от первого аргумента. Это умный (читай: трудно понять) способ заставить вашу функцию «Число» работать по индексу.

например, попробовать [1, 4, 9, 16].map(Function.call, String) , и вы увидите одно и то же, но проанализируете как строки [«1», «4», «9», «16»] ,

Позвольте пройти через то, что происходит на первой итерации, чтобы получить дополнительную ясность:

array_map — Применяет callback-функцию ко всем элементам указанных массивов

(PHP 4 >= 4.0.6, PHP 5, PHP 7)

array_map — Применяет callback-функцию ко всем элементам указанных массивов

Описание

Функция array_map() возвращает массив, содержащий элементы array1 после их обработки callback -функцией. Количество параметров, передаваемых callback -функции, должно совпадать с количеством массивов, переданным функции array_map() .

Список параметров

Callback-функция, применяемая к каждому элементу в каждом массиве.

Массив, к которому применяется callback -функция.

Дополнительные массивы для обработки callback -функцией.

Возвращаемые значения

Возвращает массив, содержащий все элементы array1 после применения callback -функции к каждому из них.

Примеры

Пример #1 Пример использования array_map()

function cube ( $n )
<
return( $n * $n * $n );
>

$a = array( 1 , 2 , 3 , 4 , 5 );
$b = array_map ( «cube» , $a );
print_r ( $b );
?>

В результате переменная $b будет содержать:

Пример #2 Использование array_map() вместе с lambda-функцией (начиная с версии PHP 5.3.0)

= function( $value ) <
return $value * 2 ;
>;

print_r ( array_map ( $func , range ( 1 , 5 )));
?>

Пример #3 Пример использования array_map() : обработка нескольких массивов

function show_Spanish ( $n , $m )
<
return( «Число $n по-испански — $m » );
>

function map_Spanish ( $n , $m )
<
return(array( $n => $m ));
>

$a = array( 1 , 2 , 3 , 4 , 5 );
$b = array( «uno» , «dos» , «tres» , «cuatro» , «cinco» );

$c = array_map ( «show_Spanish» , $a , $b );
print_r ( $c );

$d = array_map ( «map_Spanish» , $a , $b );
print_r ( $d );
?>

Результат выполнения данного примера:

Обычно при обработке двух или более массивов, они имеют одинаковую длину, так как callback-функция применяется параллельно к соответствующим элементам массивов. Если массивы имеют различную длину, более короткие из них дополняется элементами с пустыми значениями до длины самого длинного массива.

Интересным эффектом при использовании этой функции является создание массива массивов, что может быть достигнуто путем использования значения NULL в качестве имени callback-функции.

Пример #4 Создание массива массивов

= array( 1 , 2 , 3 , 4 , 5 );
$b = array( «one» , «two» , «three» , «four» , «five» );
$c = array( «uno» , «dos» , «tres» , «cuatro» , «cinco» );

$d = array_map ( null , $a , $b , $c );
print_r ( $d );
?>

Результат выполнения данного примера:

Если массив-аргумент содержит строковые ключи, то результирующий массив будет содержать строковые ключи тогда и только тогда, если передан ровно один массив. Если передано больше одного аргумента, то результирующий массив будет всегда содержать числовые ключи.

Пример #5 Использование array_map() со строковыми ключами

Результат выполнения данного примера:

Смотрите также

  • array_filter() — Фильтрует элементы массива с помощью callback-функции
  • array_reduce() — Итеративно уменьшает массив к единственному значению, используя callback-функцию
  • array_walk() — Применяет заданную пользователем функцию к каждому элементу массива
  • информация о типе callback

array-map

Как передать один дополнительный аргумент array_mapcallback? В моем примере я хотел бы перейти $smsPattern(как второй аргумент, после текущего элемента в…

Я не знаю, что я сделал неправильно с кодом ниже, но это не работает. if($_data_count = count($_csv_raw_array) > 0)< foreach($_csv_raw_array…

Как запустить array_map на тройном многомерном массиве? Где я хочу «очистить» самый внутренний массив? Выглядит так: Array ( [1] =>…

Я учусь clojure и пытаюсь реализовать проблему. Я храню карты в векторе. Каждая карта содержит идентификатор. Например [<:id 1 :name…

У меня есть массив, подобный следующему . Array ( [code] => BILL [assets] => Array ( [en] => Array (…

У меня есть проблемы с пониманием концепции Array.map. Я действительно пошел в Mozilla и учебники, но они предоставили очень ограниченную…

Я протестировал встроенную анонимную функцию array_map здесь и это сработало, но когда я попробовал то же самое с $user_meta это…

Мне было интересно, как можно выполнять функцию на каждом элементе массива на основе значения. Например, если у меня два массива:…

Коллекции в Java: о чём многие забывают

Из опыта code-review и ответов на StackOverflow набралось немало моментов, касающихся Java Collections API, которые мне казались очевидными, но другие разработчики о них почему-то не знали или знали, но не чувствовали уверенности их применять. В этой статье я собираю в общую кучу всё, что накопилось.

Содержание:

List.subList

Про это уже писали, но стоит повторить. Наверно, самый недооценённый метод из Collections API. Бывает, что надо каким-то образом обработать часть списка (например, в алгоритмах семейства «разделяй и властвуй» или при распараллеливании задачи). Многие создают метод или класс, который завязывается на три параметра: List, from и to:

Так незачем делать. Реализации алгоритма должно быть плевать, что она обрабатывает часть списка. Пишите:

Даже если у вас всё в одном методе, удобнее воспользоваться расширенным циклом for, чем возиться с индексами:

Кроме того, subList — полнофункциональный список, он работает и на запись, внося соответствующие изменения в родительский список. Нужно удалить много элементов из середины списка? Ничего нет проще:

У популярных реализаций вроде ArrayList это выполняется очень быстро.

Надо выяснить, начинается ли список с определённых элементов? И тут subList в руки!

Надо добавить в один список все элементы другого списка за исключением первого? И тут subList придёт на помощь:

Не забывайте, что можно писать Arrays.asList(array).subList(from, to) , поэтому вышесказанное применимо и для непримитивных массивов. Структурно менять вы их не сможете, но передавать кусок массива в метод, принимающий список для чтения — легко.

PriorityQueue

Если subList — самый недооценённый метод, то PriorityQueue — это, на мой взгляд, самый недооценённый класс. Многие сталкиваются с задачей отыскать, скажем, 10 минимальных значений большого несортированного списка. Чаще всего список сортируют и потом берут первые 10 значений. Если исходный список менять нельзя, придётся его ещё скопировать для сортировки. А ведь очередь с приоритетом легко справится с этой задачей:

Такой код в зависимости от данных может работать гораздо быстрее, чем сортировка. Например, для n = 10 и случайно заполненного списка из миллиона элементов очередь с приоритетом почти в сто раз обгоняет подход с сортировкой. При этом дополнительной памяти требуется O(n) и входные элементы можно обрабатывать в потоковом режиме (например, выбрать 10 наименьших чисел из входного файла).

Вообще людям свойственно изучить пару-тройку структур данных и пользоваться ими везде. Не ленитесь, познакомьтесь с разными структурами.

EnumSet и EnumMap

До сих пор встречается код, где значения типа enum используют в качестве ключей в HashSet и HashMap. Хотя это работает, но оно неоправданно расточительно. Существующие специальные классы EnumSet и EnumMap значительно производительнее. Так если в enum не больше 64 разных значений, EnumSet хранит всё в одном поле типа long в битовой маске. EnumMap содержит все значения в обычном массиве той же длины, сколько элементов в enum, а ключи не хранит вовсе. Так как у каждого значения в enum есть порядковый номер ordinal(), можно легко перейти от enum-ключа к элементу массива. Также никогда не нужно менять размер массива.

Set.add(E) и Set.remove(E) возвращают булево значение

Часто вижу подобный код:

Не надо забывать, что операция добавления в Set возвращает true, если добавление успешно (то есть элемента не было) и false, если такой элемент уже был. Незачем усложнять код и два раза пробивать элемент по хэш-таблице или двоичному дереву, ведь можно написать:

Аналогично с удалением. Цепочка if(set.contains(item)) < set.remove(item); . >заменяется на if(set.remove(item)) < . >.

Map.put(K, V), Map.remove(K), List.set(idx, E), List.remove(idx) возвращают предыдущий элемент

Из той же оперы ситуация. Методы, изменяющие или удаляющие элемент в коллекции возвращают предыдущее значение, и этим надо пользоваться. Не надо писать, например, так:

Написать просто Item item = myMap.put(key, newItem); . Хотите поменять местами две записи в Map с ключами key1, key2? Временная переменная не нужна:

Map.keySet() и Map.values()

Многие почему-то забывают, что Map.keySet() и Map.values() возвращают отображения исходного Map, которые позволяют удалять элементы (если Map модифицируемый). Надо оставить в Map только записи с определёнными значениями (и любыми ключами)? Пожалуйста:

Также работает removeAll , а с Java-8 ещё и removeIf :

Arrays.asList может быть ключом

Бывает, что вам нужно сформировать Map или Set, используя кортеж значений. Например, у вас есть PoJo-объекты Item , у которых имеются поля name, type, version . У них уже написан equals и hashCode , их можно складывать в HashSet , всё нормально. Но вы хотите выбрать из коллекции уникальные объекты только по полям name и type , игнорируя version. Менять существующие equals и hashCode нельзя. В таких ситуациях люди часто создают отдельный класс только с полями name и type и используют его в качестве ключа. Однако для одноразовой операции проще использовать Arrays.asList() :

Arrays.asList() создаёт список из нужного числа элементов и у него как раз подходящие реализации equals и hashCode : никакой boilerplate не нужен. Так можно создать ключ любой длины, причём корректно обработаются null-значения и примитивы (брагодаря боксингу). Не сработает только, если вы хотите в составе ключа иметь массив.

Collections.min/max

Удивительно, насколько часто можно встретить написанный вручную код, который находит максимальный или минимальный элемент чего-то по какому-нибудь критерию. Казалось бы, такая тривиальная задача должна быть давно решена. На самом деле она и так давно решена: есть методы Collections.min и Collections.max . Раньше было не очень удобно писать компараторы, но в Java-8 всё стало легче.

К примеру, вам нужно найти ключ в Map, соответствующий максимальному значению. Пишите так:

Можно и через Stream API, но Collections.max() несколько быстрее. Если вы не можете использовать Java-8 и компараторы вроде Entry.comparingByValue() вам недоступны, их нетрудно написать.

Stack, Vector, Hashtable, LinkedList

Просто не используйте эти классы. Пользы от них никакой нет. Вместо Stack пользуйтесь ArrayDeque, вместо Vector — ArrayList, вместо Hashtable — HashMap. Если вам нужна потокобезопасность, они вам всё равно не помогут. Возможно, в девятке их всё-таки пометят @Deprecated (смотрите JEP 277).

С LinkedList случай особый. Вроде бы лучшего аналога связного списка нет и ходят легенды, что он на самом деле полезен. В действительности ситуаций, когда LinkedList лучше, чем ArrayList, в реальной жизни исключительно мало. До Java-8 LinkedList ещё мог пригодиться, если вы часто удаляете элементы, идущие не последовательно, по какому-то условию. В Java-8 для этих целей появился List.removeIf , который в ArrayList, конечно, реализован оптимальнее (элементы передвигаются только один раз). Если вам надо сделать много вставок в разные места (задача сама по себе экзотическая), скорее всего быстрее будет создать новый ArrayList, чем вставлять в существующий LinkedList. Ну и помните, что LinkedList кушает в несколько раз больше памяти, так как каждый элемент — это отдельный объект в куче со ссылками на следующий и предыдущий. LinkedList можно использовать только в качестве учебного примера.

На сегодня всё. Программируйте с удовольствием!

Чтобы не забыть

Рубрики

Метки

  • Сентябрь 2020 (1)
  • Июль 2020 (1)
  • Май 2020 (4)
  • Апрель 2020 (1)
  • Август 2020 (1)
  • Июль 2020 (3)
  • Июнь 2020 (2)
  • Май 2020 (5)
  • Апрель 2020 (3)
  • Февраль 2020 (1)
  • Декабрь 2020 (2)
  • Октябрь 2020 (1)
  • Сентябрь 2020 (1)
  • Июнь 2020 (2)
  • Май 2020 (5)
  • Апрель 2020 (4)
  • Октябрь 2020 (1)
  • Август 2020 (2)
  • Июнь 2020 (2)
  • Май 2020 (1)
  • Апрель 2020 (1)
  • Март 2020 (1)
  • Февраль 2020 (5)
  • Январь 2020 (7)
  • Ноябрь 2015 (1)
  • Октябрь 2015 (3)
  • Сентябрь 2015 (6)
  • Август 2015 (6)
  • Июль 2015 (2)
  • Июнь 2015 (1)
  • Май 2015 (5)
  • Апрель 2015 (5)
  • Февраль 2015 (4)
  • Январь 2015 (3)
  • Декабрь 2014 (1)
  • Ноябрь 2014 (8)
  • Октябрь 2014 (3)
  • Август 2014 (7)
  • Июль 2014 (4)
  • Июнь 2014 (5)
  • Май 2014 (13)
  • Апрель 2014 (4)
  • Март 2014 (1)
  • Февраль 2014 (1)
  • Январь 2014 (2)
  • Декабрь 2013 (8)
  • Ноябрь 2013 (19)

Записная книжка рассеянного [в пространстве и времени] программиста

Интересно, почему такой вопрос часто всплывает на форумах или где-то еще?

Сначала постараюсь ответить на вопрос «нафига?», а потом на вопрос «как?».

Мы привыкли, что в в питоне, js и множестве других языков и фреймворков есть функция map, которая применяет некоторую функцию-обработчик к каждому элементу в списке данных и возвращающую результат в том же порядке. Пруф.

Но никто не ждал, что хеш-таблица и массив в контексте одного из языков будет означать одно и то же. Опять же пруф.

Этот постыдный момент из жизни структуры привел к тому, что одним из самых частых применений массивов (в пхп конечно же) стало создание отображений категория=>какое-то значение.

А после того как у вас появилось отображение вы, вероятно, захотите это где-нибудь на сгенерированной странице отобразить.

Т.е. показать пользователю сам параметр, а скобках его категорию.

Как мы делаем это в языках (фреймворках), которые разделяют понятие массива и хеш-таблицы? Перебираем объект, который содержит категории и формируем по нему массив выводимых данных. Наверное так.

И тут мы открываем руководство по php и видим, что она применяет некий колбек ко всем элементам массива и после этого возвращает новый массив.

Удобно же! Применили колбек к массиву и получили обработанный.

И что-то не заладилось. �� Ключи в колбек не попадают. Можно сделать все через foreach, но тогда нам потребуется еще одна переменная. А тут все было просто и наглядно.

И мы идем в гугель: «php array_map with keys».

А зачем гуглить-то?

И все отлично работает. И притом правильно. Относительно конечно же. И никаких вам лишних переменных.

А тем временем в коде вновь и вновь появляются конструкции вида

Проблема кейса из статьи может быть и раздута, но при вчитывании в сотни строк кода более-менее понятными сходу являются только первые два варианта.

Вариант же с array_walk на понятность никак не претендует (как и решение подобной задачи при помощи .each в jquery).

array_map

(PHP 4 >= 4.0.6, PHP 5, PHP 7)

array_map — Применяет callback-функцию ко всем элементам указанных массивов

Описание

Функция array_map() возвращает array , содержащий результаты применения callback -функции к соответствующему индексу array1 (и . , если указано больше массивов), используемого в качестве аргумента callback-функции. Количество параметров, передаваемых callback -функции, должно совпадать с количеством массивов, переданным функции array_map() .

Список параметров

Callback-функция, применяемая к каждому элементу в каждом массиве.

NULL может быть передан в качестве значения callback для выполнения zip операции с несколькими массивами. Если указан только array1 , array_map() вернет входной массив.

Массив, к которому применяется callback -функция.

Дополнительные массивы для обработки callback -функцией.

Возвращаемые значения

Возвращает массив, содержащий результаты применения callback -функции к соответствующему индексу array1 (и . , если указано больше массивов), используемого в качестве аргумента для callback-функции.

Примеры

Пример #1 Пример использования array_map()

function cube ( $n )
<
return ( $n * $n * $n );
>

$a = [ 1 , 2 , 3 , 4 , 5 ];
$b = array_map ( ‘cube’ , $a );
print_r ( $b );
?>

В результате переменная $b будет содержать:

Пример #2 Использование array_map() вместе с лямбда-функцией (начиная с PHP 5.3.0)

= function( $value ) <
return $value * 2 ;
>;

print_r ( array_map ( $func , range ( 1 , 5 )));
?>

Пример #3 Пример использования array_map() : обработка нескольких массивов

function show_Spanish ( $n , $m )
<
return «Число < $n >по-испански — < $m >» ;
>

function map_Spanish ( $n , $m )
<
return [ $n => $m ];
>

$a = [ 1 , 2 , 3 , 4 , 5 ];
$b = [ ‘uno’ , ‘dos’ , ‘tres’ , ‘cuatro’ , ‘cinco’ ];

$c = array_map ( ‘show_Spanish’ , $a , $b );
print_r ( $c );

$d = array_map ( ‘map_Spanish’ , $a , $b );
print_r ( $d );
?>

Результат выполнения данного примера:

Обычно при обработке двух или более массивов, они имеют одинаковую длину, так как callback-функция применяется параллельно к соответствующим элементам массивов. Если массивы имеют различную длину, более короткие из них дополняется элементами с пустыми значениями до длины самого длинного массива.

Интересным эффектом при использовании этой функции является создание массива массивов, что может быть достигнуто путем использования значения NULL в качестве имени callback-функции.

Пример #4 Выполнение zip операции с массивами

= [ 1 , 2 , 3 , 4 , 5 ];
$b = [ ‘one’ , ‘two’ , ‘three’ , ‘four’ , ‘five’ ];
$c = [ ‘uno’ , ‘dos’ , ‘tres’ , ‘cuatro’ , ‘cinco’ ];

$d = array_map ( null , $a , $b , $c );
print_r ( $d );
?>

Результат выполнения данного примера:

Если массив-аргумент содержит строковые ключи, то результирующий массив будет содержать строковые ключи тогда и только тогда, если передан ровно один массив. Если передано больше одного аргумента, то результирующий массив будет всегда содержать числовые ключи.

Пример #5 NULL callback только с array1

Результат выполнения данного примера:

Пример #6 Использование array_map() со строковыми ключами

Результат выполнения данного примера:

Смотрите также

  • array_filter() — Фильтрует элементы массива с помощью callback-функции
  • array_reduce() — Итеративно уменьшает массив к единственному значению, используя callback-функцию
  • array_walk() — Применяет заданную пользователем функцию к каждому элементу массива
  • Информация о типе callback

User Contributed Notes 46 notes

I was miffed that array_map didn’t have a way to pass values *and* keys to the callback, but then I realized I could do this:

function callback($k, $v)

array_map( «callback», array_keys($array), $array);

If you need to call a static method from array_map, this will NOT work:

( ‘myclass::myMethod’ , $value );
?>

Instead, you need to do this:

( array( ‘myclass’ , ‘myMethod’ ) , $value );
?>

It is helpful to remember that this will work with any PHP function which expects a callback argument.

PHP 5.3 enables us to use inline anonymous functions with array_map, cleaning up the syntax slightly.

= array(
array( ‘id’ => 1 , ‘name’ => ‘Bob’ , ‘position’ => ‘Clerk’ ),
array( ‘id’ => 2 , ‘name’ => ‘Alan’ , ‘position’ => ‘Manager’ ),
array( ‘id’ => 3 , ‘name’ => ‘James’ , ‘position’ => ‘Director’ )
);

print_r ( $names );
?>

This was possible (although not recommended) in prior versions of PHP 5, via create_function().

= array_map (
create_function ( ‘$person’ , ‘return $person[«name»];’ ),
$data
);
?>

You’re less likely to catch errors in the latter version because the code is passed as string arguments.

These are alternatives to using a foreach:

foreach ( $data as $row ) <
$names [] = $row [ ‘name’ ];
>
?>

You can use array_map with PHP native functions as well as user functions. This is very handy if you need to sanitize arrays.

= array_map ( ‘intval’ , $integers );
$safeStrings = array_map ( ‘mysql_real_escape_string’ , $unsafeStrings );

This function behaves exactly like array_map but additionally does not reject non-array arguments. Instead, it transforms them with the array_fill function to a constant valued array of required length according to the other array arguments (if any) and executes the original array_map function.

function array_map2 () <
$args = func_get_args ();

$callback = array_shift ( $args );

$args = array_map (
create_function ( ‘$a,$max’ , ‘return is_array($a)? $a: array_fill(0,$max,$a);’ ),
$args , array_fill ( 0 , count ( $args ), array_reduce ( $args ,
create_function ( ‘$v,$w’ , ‘return max($v,is_array($w)? count($w): 1);’ ))));

array_unshift ( $args , $callback );

return call_user_func_array ( «array_map» , $args );
>

print_r ( array_map2 ( «explode» , «=» , explode ( «&» , $get )));

Array
(
[ 0 ] => Array
(
[ 0 ] => first
[ 1 ] => value1
)

[ 1 ] => Array
(
[ 0 ] => second
[ 1 ] => value2
)

[ 2 ] => Array
(
[ 0 ] => third
[ 1 ] => value3
)
)

To transpose rectangular two-dimension array, use the following code:

array_unshift($array, null);
$array = call_user_func_array(«array_map», $array);

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);

Here is example:

= array(
array( 1 , 2 , 3 ),
array( 4 , 5 , 6 ));
array_unshift ( $a , null );
$a = call_user_func_array ( «array_map» , $a );
print_r ( $a );
?>

Output:

Simplest array_map_recursive() implemention.

function array_map_recursive (callable $func , array $array ) <
return filter_var ( $array , \ FILTER_CALLBACK , [ ‘options’ => $func ]);
>
?>

If you are using Namespaces, the array_map callback expects the Fully Qualified NameSpace to be used.

For example, this won’t work:
namespace Test ;
function mapping_function ( $var ) <
.
>
array_map ( ‘mapping_function’ , $array ); //won’t find ‘mapping_function’ here.
?>

This, however, will work:
namespace Test ;
function mapping_function ( $var ) <
.
>
array_map ( ‘Test\mapping_function’ , $array ); //using FQNS.
?>

Note that the $arr argument has to be an array, not just a Traversable/Iterator.

For instance this won’t work:

= $mongo -> db -> collection -> find ();
// $documents is Traversable by foreach

$ids = array_map (function( $document ) <
return $document [ ‘_id’ ];
>, $objects );
// $ids will now be NULL, because $documents wasn’t an Array

?>

A solution is to first use iterator_to_array():

= array_map (function( $document ) <
return $document [ ‘_id’ ];
>, iterator_to_array ( $objects ));
// $ids will now be an array of [‘_id’]s

?>

But this is not very efficient: two cycles instead of one. Another solution is to use foreach: one cycle and a lot of freedom (and in the same scope).

Hope I’m not late to the party, here’s my function to apply array_map to the *keys* of an array.
Extra array arguments will be used for the callback function’s parameters just like with array_map, with the difference that a string is also allowed: it will just be used to create an array of appropriate length with as each value that string. Arrays are left alone (and will be padded with nulls by array_map as needed).

//_________________________________________________
// array_map_keys($callback, $array, [$args, ..]) /
function array_map_keys ( $callback , $array /* [, $args ..] */ ) <
$args = func_get_args ();
if (! is_callable ( $callback )) trigger_error ( «first argument (callback) is not a valid function» , E_USER_ERROR );
if (! is_array ( $array )) trigger_error ( «second argument must be an array» , E_USER_ERROR );
$args [ 1 ] = array_keys ( $array );
// If any additional arguments are not arrays, assume that value is wanted for every $array item.
// array_map() will pad shorter arrays with Null values
for ( $i = 2 ; $i count ( $args ); $i ++) <
if (! is_array ( $args [ $i ])) <
$args [ $i ] = array_fill ( 0 , count ( $array ), $args [ $i ]);
>
>
return array_combine ( call_user_func_array ( ‘array_map’ , $args ), $array );
>

$arr = array( ‘foo’ => 123 , ‘bar’ => 456 );

// simply uppercase keys:
var_dump ( array_map_keys ( ‘strtoupper’ , $arr ));
// or..
var_dump ( array_map_keys (function( $input ) , $arr ));
// >> array(2) < ["FOO"]=>int(123) , [«BAR»]=> int(456) >

// Add a prefix ‘myvar_’:
var_dump ( array_map_keys (function( $input , $prefix ) , $arr , ‘myvar_’ ));
// >> array(2) < ["myvar_foo"]=>int(123) , [«myvar_bar»]=>int(456) >

// Apart from the (static string) prefix, we also number them:
$arr = array( ‘foo’ => 123 , ‘bar’ => 456 , ‘bazz’ => 789 , ‘yadda’ => ‘0AB’ );
var_dump ( array_map_keys (function( $input , $middle , $number ) , $arr , ‘myvar_’ , range ( 1 , count ( $arr ))));
// >> array(4) < ["1:myvar_foo"]=>int(123) , [«2:myvar_bar»]=>int(456) , [«3:myvar_bazz»]=>int(789) , [«4:myvar_yadda»]=>string(3) «0AB» >

Let’s assume we have following situation:

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.

Here is how to perform an operation on some of the elements of an array:

= array(
‘item1’ => 0 ,
‘item2’ => 0 ,
‘item3’ => 0 ,
‘item4’ => 0 ,
‘item5’ => 0 ,
);

$items_to_modify = array( ‘item1’ , «item3» );

?>

This will take the original array and perform an action only on items specified on the second array items. Use of & symbol in the use statement makes the array_map access the variable as a reference in an outer scope.

This makes code easily extendable.

If you want to pass an argument like ENT_QUOTES to htmlentities, you can do the follow.

= array_map ( ‘htmlentities’ , $array , array_fill ( 0 , count ( $array ) , ENT_QUOTES ) );
?>

The third argument creates an equal sized array of $array filled with the parameter you want to give with your callback function.

JavaScript метод map()

Определение и применение

JavaScript метод map() позволяет вызвать переданную функцию один раз для каждого элемента массива, формируя новый массив из результатов вызова этой функции.

Обращаю Ваше внимание, что функция обратного вызова, переданная в качестве параметра метода map() не будет вызвана для удалённых, или пропущенных элементов массива. Метод map() не изменяет массив для которого он был вызван (хотя функция обратного вызова может это делать).

Диапазон элементов, обрабатываемых с помощью метода map() устанавливается перед первым вызовом функции обратного вызова. Если элементы были добавлены к массиву после её вызова, то на таких элементах функция вызвана не будет.

Если значения существующих элементов массива изменяются в момент выполнения, то в качестве передаваемого значения функции будет значение в тот момент времени, когда метод map() посещает их. Если элементы удаляются до их посещения, то такие элементы посещены не будут. Если элементы, которые уже посещены, удаляются во время прохода по массиву, то более поздние элементы будут пропущены.

Поддержка браузерами

Метод Chrome Firefox Opera Safari IExplorer Edge
map() Да Да Да Да 9.0 Да

JavaScript синтаксис:

Версия JavaScript

Значения параметров

Параметр Описание
function Функция обратного вызова, которая будет выполнена один раз для каждого элемента в массиве. Функция принимает следующие параметры:
  • currentValue — значение текущего элемента
  • index — индекс массива текущего элемента.
  • arr — массив, к которому принадлежит текущий элемент (по которому происходит проход).

Если в качестве параметра метода передается что-то, что не является объектом функции, то будет вызвано исключение TypeError. Обязательный параметр.

thisValue Объект, на который может ссылаться ключевое слово this внутри функции обратного вызова. Если параметр thisValue не используется, то в качестве значения this будет использоваться undefined (в конечном счете this будет зависеть от обычных правил контекста выполнения функции). Необязательный параметр.

Пример использования

В следующем примере с использованием JavaScript метода map() мы рассмотрим как получить новый массив, который содержит элементы другого массива увеличенные в два раза:

В следующем примере мы рассмотрим использование второго аргумента метода map(), который указывает на объект, на который мы можем ссылаться с использованием ключевого слова this внутри функции обратного вызова:

Array.map() как удобный способ преобразовать массив

При работе с прототипами часто возникает необходимость обработать какой-нибудь массив с данными и преобразовать его в другой массив.

Пусть, например, у нас есть массив с «грязными данными» и нам нужно привести его к чистому виду (вычистить лишние пробелы):

Удалять лишние пробелы будем при помощи самописной функции trim() . Её код не важен, но всё же приведу его здесь для полной картины:

«Традиционный» способ, который есть с первых версий JS, и поэтому часто встречается в сети и головах людей, — пройтись в цикле по всем элементам и добавлять обработанные элементы один за другим в новый массив:

Но в современной версии JS у каждого массива есть метод map() , который позволяет сделать то же самое проще и нагляднее:

В качестве параметра в map передаётся коллбэк (в нашем случае — функция trim() ). Коллбэк применяется к каждому элементу массива, и то, что он возвращает — записывается в новый массив.

В результате у нас получится обработанный массив без лишних пробелов:

При помощи этого метода удобно, например, преобразовывать списки элементы со страницы в данные, полученные из них. Найдём на странице все теги LI при помощи document.querySelectorAll() :

Преобразуем их в массив при помощи оператора расширения [. ] и при передадим в map функцию-коллбэк, которая вернёт для каждого элемента его текстовое содержимое.

При помощи стрелочной функции это можно сделать ещё более наглядно:

array_map

(PHP 4 >= 4.0.6, PHP 5)

array_map — Применяет callback-функцию ко всем элементам указанных массивов

Описание

Функция array_map() возвращает массив, содержащий элементы arr1 после их обработки callback-функцией. Количество параметров, передаваемых callback-функции, должно совпадать с количеством массивов, переданным функции array_map() .

Список параметров

Callback-функция, применяемая к каждому элементу в каждом массиве.

Массив, к которому применяется callback-функция.

Дополнительные массивы для обработки callback-функцией.

Возвращаемые значения

Возвращает массив, содержащий все элементы arr1 после применения callback-функции к каждому из них.

Примеры

Пример #1 Пример использования array_map()

function cube ( $n )
<
return( $n * $n * $n );
>

$a = array( 1 , 2 , 3 , 4 , 5 );
$b = array_map ( «cube» , $a );
print_r ( $b );
?>

В результате переменная $b будет содержать:

Пример #2 Использование array_map() вместе с lambda-функцией (начиная с версии PHP 5.3.0)

= function( $value ) <
return $value * 2 ;
>;

print_r ( array_map ( $func , range ( 1 , 5 )));
?>

Пример #3 Пример использования array_map() : обработка нескольких массивов

function show_Spanish ( $n , $m )
<
return( «Число $n по-испански — $m » );
>

function map_Spanish ( $n , $m )
<
return(array( $n => $m ));
>

$a = array( 1 , 2 , 3 , 4 , 5 );
$b = array( «uno» , «dos» , «tres» , «cuatro» , «cinco» );

$c = array_map ( «show_Spanish» , $a , $b );
print_r ( $c );

$d = array_map ( «map_Spanish» , $a , $b );
print_r ( $d );
?>

Результат выполнения данного примера:

Обычно при обработке двух или более массивов, они имеют одинаковую длину, так как функция обратного вызова применяется параллельно к соответствующим элементам массивов. Если массивы имеют различную длину, самый маленький из них дополняется элементами с пустыми значениями.

Интересным эффектом при использовании этой функции является создание массива массивов, что может быть достигнуто путем использования значения NULL в качестве имени callback-функции.

Пример #4 Создание массива массивов

= array( 1 , 2 , 3 , 4 , 5 );
$b = array( «one» , «two» , «three» , «four» , «five» );
$c = array( «uno» , «dos» , «tres» , «cuatro» , «cinco» );

$d = array_map ( null , $a , $b , $c );
print_r ( $d );
?>

Результат выполнения данного примера:

Если массив-аргумент содержит строковые ключи, то результирующий массив будет содержать строковые ключи тогда и только тогда, если передан ровно один массив. Если передано больше одного аргумента, то результирующий массив будет всегда содержать числовые ключи.

Пример #5 Использование array_map() со строковыми ключами

Результат выполнения данного примера:

Смотрите также

  • array_filter() — Фильтрует элементы массива с помощью callback-функции
  • array_reduce() — Итеративно уменьшает массив к единственному значению, используя callback-функцию
  • array_walk() — Применяет пользовательскую функцию к каждому элементу массива
  • create_function() — Создаёт анонимную (lambda-style) функцию

информация о типе callback

Илон Маск рекомендует:  Что такое код asp getadvertisement
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL