Что такое код array_walk


FPublisher

Web-технологии: База знаний

Документация PHP

array_walk

array_walk — Применить пользовательскую функцию к каждому члену массива

Описание

bool array_walk ( array $&array , callback $funcname [, mixed $userdata ] )

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Применяет пользовательскую функцию funcname к каждому элементу массива array . Обычно у функции funcname два параметра. Значение массива array в качестве первого параметра, и ключ/индекс в качестве второго. Если указан дополнительный параметр userdata , он будет передан в качестве третьего параметра в функцию обратного вызова funcname .

Если в функцию funcname должно быть передано больше параметров, чем передано на самом деле, ошибка уровня E_WARNING будет генерироваться каждый раз как array_walk() будет вызывать funcname . Эти предупреждения могут быть подавлены добавлением оператора управления ошибками PHP @ в вызов array_walk(), или использованием error_reporting().

Замечание: Если требуется, чтобы функция funcname изменила значения в массиве, определите первый параметр funcname как ссылку. Тогда все изменения будут применены к элементам массива.

Замечание: Передача в funcname параметров key и userdata была добавлена в версии 4.0.0

array_walk() не изменяет внутренний указатель массива array . array_walk() обойдёт все элементы массива независимо от позиции указателя. Для того чтобы сбросить указатель, используйте функцию reset(). В PHP 3 array_walk() сбрасывает указатель.

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

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

= array( «d» => «lemon» , «a» => «orange» , «b» => «banana» , «c» => «apple» );

function test_print ( $item2 , $key )
<
echo «$key. $item2
\n» ;
>

echo «Before . \n» ;
array_walk ( $fruits , ‘test_print’ );

array_walk ( $fruits , ‘test_alter’ , ‘fruit’ );
echo «. and after:\n» ;

array_walk ( $fruits , ‘test_print’ );
?>

Как использовать функцию PHP array_walk для перестановки ключей в многомерном массиве?

У меня есть массив PHP в следующем формате:

Я пытаюсь использовать функцию array_walk() в PHP для перестановки ключей массива следующим образом:

Для этого я использую следующий код:

Но этот код, который я сейчас использую, производит ТОЛЬКО первый элемент A и не производит следующие элементы B и C. I. Я ожидаю полного вывода, но получаю только первый элемент следующим образом:

Что такое код array_walk


(PHP 3 >= 3.0.3, PHP 4, PHP 5)

array_walk — Применить пользовательскую функцию к каждому члену массива

Описание bool array_walk ( array &array, callback funcname [, mixed userdata] )

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Применяет пользовательскую функцию funcname к каждому элементу массива array . Обычно у функции funcname два параметра. Значение массива array в качестве первого параметра, и ключ/индекс в качестве второго. Если указан дополнительный параметр userdata , он будет передан в качестве третьего параметра в функцию обратного вызова funcname .

Замечание: Если требуется, чтобы функция funcname изменила значения в массиве, определите первый параметр funcname как ссылку . Тогда все изменения будут применены к элементам массива.

Замечание: Передача в funcname параметров key и userdata была добавлена в версии 4.0.0

array_walk() не изменяет внутренний указатель массива array . array_walk() обойдёт все элементы массива независимо от позиции указателя. Для того чтобы сбросить указатель, используйте функцию reset() . В PHP 3 array_walk() сбрасывает указатель.

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

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

= array( «d» => «lemon» , «a» => «orange» , «b» => «banana» , «c» => «apple» );

function test_print ( $item2 , $key )
<
echo «$key. $item2
\n» ;
>

echo «Before . \n» ;
array_walk ( $fruits , ‘test_print’ );

array_walk ( $fruits , ‘test_alter’ , ‘fruit’ );
echo «. and after:\n» ;

Разница между array_map, array_walk и array_filter

В чем же разница между array_map , array_walk и array_filter . Что я вижу из документации, так это то, что вы можете передать функцию обратного вызова для выполнения действия в поставляемом массиве. Но я, кажется, не обнаружил особых различий между ними.

Выполняют ли они то же самое?
Можно ли их использовать взаимозаменяемо?

Я был бы признателен за вашу помощь с иллюстративным примером, если они совсем разные.

  • array_map не имеет побочных эффектов, в то время как array_walk может; в частности, array_map никогда не меняет своих аргументов.
  • array_map не может работать с ключами массива, array_walk может.
  • array_map возвращает массив, array_walk возвращает true / false . Следовательно, если вы не хотите создавать массив в результате прохождения одного массива, вы должны использовать array_walk .
  • array_map также может принимать произвольное количество массивов, а array_walk работает только на одном.
  • array_walk может получить дополнительный произвольный параметр для перехода к array_walk вызову. Это в основном не имеет значения с PHP 5.3 (когда были введены анонимные функции ).
  • Результирующий массив array_map / array_walk имеет такое же количество элементов, что и аргумент (ы); array_filter выбирает только подмножество элементов массива в соответствии с функцией фильтрации. Он сохраняет ключи.

Идея сопоставления функции с массивом данных исходит из функционального программирования. Вы не должны думать о array_map как о цикле foreach который вызывает функцию для каждого элемента массива (даже если это так реализовано). Это следует рассматривать как применение функции к каждому элементу в массиве независимо.

Теоретически такие вещи, как сопоставление функций, могут выполняться параллельно, поскольку функция, применяемая к данным, должна ТОЛЬКО влиять на данные и НЕ глобальное состояние. Это связано с тем, что array_map может выбрать любой порядок применения функции к элементам (хотя в PHP это не так).

array_walk с другой стороны, представляет собой совершенно противоположный подход к обработке массивов данных. Вместо того, чтобы обрабатывать каждый элемент отдельно, он использует состояние ( &$userdata ) и может редактировать элемент на месте (подобно циклу foreach). Поскольку каждый раз, когда элемент имеет $funcname применяемое к нему, он может изменять глобальное состояние программы, и для этого требуется один правильный способ обработки элементов.

Вернувшись в PHP land, array_map и array_walk почти идентичны, за исключением того, что array_walk дает вам больше контроля над итерацией данных и обычно используется для «изменения» данных на месте и возврата нового «измененного» массива.

array_filter – действительно приложение array_walk (или array_reduce ), и это более или менее просто предусмотрено для удобства.

bool array_walk (array & $ array, callback $ funcname [, mixed $ userdata]) F и изменяет его, заменяя каждый элемент x на F(x) .

array array_map (callback $ callback, array $ arr1 [, array $ …]) F вместо преобразования элементов удалит любые элементы, для которых F(x) не является истинным

Другие ответы демонстрируют разницу между array_walk (модификация на месте) и array_map (возврат измененной копии) достаточно хорошо. Тем не менее, они действительно не упоминают array_reduce, что является иллюстративным способом понять array_map и array_filter.

Функция array_reduce принимает массив, функцию с двумя аргументами и «аккумулятор», например:

Элементы массива объединены с аккумулятором один за раз, используя данную функцию. Результат вышеуказанного вызова аналогичен тому, как это делается:

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

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

Итак, что это связано с array_map и array_filter? Оказывается, они оба являются особым видом array_reduce. Мы можем реализовать их следующим образом:

Игнорируйте тот факт, что array_map и array_filter принимают свои аргументы в другом порядке; это просто еще одна причуда PHP. Важным моментом является то, что правая сторона идентична, за исключением функций, которые я назвал $ MAP и $ FILTER. Итак, как они выглядят?

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

  • $ MAP всегда будет добавляться к $ аккумулятору, но $ FILTER будет делать это только в том случае, если $ function ($ element) имеет значение TRUE.
  • $ FILTER добавляет исходный элемент, но $ MAP добавляет $ function ($ element).

Обратите внимание, что это далеко не бесполезные мелочи; мы можем использовать его для повышения эффективности наших алгоритмов!

Мы часто видим код, похожий на эти два примера:

Использование array_map и array_filter вместо циклов делает эти примеры очень приятными. Однако это может быть очень неэффективно, если $ input велико, так как первый вызов (карта или фильтр) будет пересекать $ input и строить промежуточный массив. Этот промежуточный массив передается прямо во второй вызов, который снова пересечет все это, тогда промежуточный массив должен быть собран в мусор.

Мы можем избавиться от этого промежуточного массива, используя тот факт, что array_map и array_filter являются примерами array_reduce. Объединив их, нам нужно только пройти $ input один раз в каждом примере:

ПРИМЕЧАНИЕ. Мои реализации array_map и array_filter выше не будут вести себя точно так же, как PHP, так как мой массив array_map может обрабатывать только один массив за один раз, и мой массив_filter не будет использовать «пустую» в качестве функции $ по умолчанию. Кроме того, ни один из них не сохранит ключи.

Нетрудно заставить их вести себя как PHP, но я чувствовал, что эти сложности затруднят определение основной идеи.

Следующая ревизия направлена ​​на более четкое определение массивов PHP array_filer (), array_map () и array_walk (), все из которых исходят из функционального программирования:


array_filter () отфильтровывает данные, создавая в результате новый массив, содержащий только нужные элементы предыдущего массива, следующим образом:

живой код здесь

Все числовые значения отфильтровываются из массива $, оставляя $ filter только с фруктами.

array_map () также создает новый массив, но в отличие от array_filter () результирующий массив содержит каждый элемент входного файла $ filter, но с измененными значениями из-за применения обратного вызова к каждому элементу следующим образом:

живой код здесь

Код в этом случае применяет обратный вызов с использованием встроенного strtoupper (), но определенная пользователем функция также является другой жизнеспособной опцией. Обратный вызов применяется к каждому элементу $ filter и тем самым порождает $ nu, чьи элементы содержат заглавные значения.

В следующем фрагменте массив walk () перемещает $ nu и вносит изменения в каждый элемент по отношению к ссылочному оператору ‘&’. Изменения происходят без создания дополнительного массива. Значение каждого элемента меняется на более информативную строку с указанием ее ключа, категории и значения.

Примечание. Функция обратного вызова по отношению к array_walk () принимает два параметра, которые автоматически получат значение элемента и его ключ и в этом порядке тоже при вызове array_walk (). (См. Больше здесь ).

Почему array_walk() не работает так, как предполагалось?

Код ниже code does not work должным образом.

Почему это работает, когда мы передаем ссылку на отдельную запись в массиве $fruits .

Примечание. Я знаю, что array_map и foreach будут работать, но почему array_walk() не работает?.

4 ответа

3 Решение user2864740 [2013-10-30 22:30:00]

Обычно PHP использует семантику Call on Value при оценке функции. Это означает, что переназначения параметров не будут влиять на привязки переменных в вызывающем. Из-за этого назначение в «нерабочем» коде не влияет на обратный вызов и, таким образом, не изменяет массив шага.

Однако, когда параметр функции указан как &.. (как описано в разделе » Передача по ссылке»), семантика переключается на » Вызов по ссылке». Это означает, что переменные в вызывающем абоненте могут быть изменены путем переназначения параметров. В этом случае присваивание локальному параметру переназначает текущий итерированный элемент массива через семантику Call by Reference и код «работает».

Теперь array_walk «работает» таким образом, потому что он был разработан для работы с семантикой Call by Reference. array_map , с другой стороны, использует возвращаемое значение обратного вызова.

2 Joren [2013-10-30 22:25:00]

С function($a) передается копия $a функции.

С function(&$a) передается ссылка на $a на функцию. Таким образом вы можете изменить $a из функции.

Вот почему array_walk обладает большей эффективностью в памяти, чем array_map ; вам не нужна дополнительная переменная, вы применяете функцию к каждому элементу оригинала вместо того, чтобы возвращать вновь измененный массив.

2 Shawn [2013-10-30 22:24:00]

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

0 Arantir [2013-10-30 22:24:00]

В первом примере $a является локальной переменной. Все изменения вне функции теряются. Кстати, ссылка на реальный массив и изменяет его, но не локальную копию.

array_walk


(PHP 3>= 3.0.3, PHP 4)

array_walk — применяет пользовательскую функцию к каждому члену массива.

Описание

int array_walk (array array, string func [, mixed userdata])

Применяет определённую пользователем функцию func к каждому элементу массива array.
Функции func значение элемента массива будет передано как первый параметр, а ключ — как второй параметр. Если userdata предоставлен, он будет передан как третий параметр в пользовательскую функцию.
func
обязана быть определяемой пользователем функцией и не может быть встроенной функцией PHP. Таким образом, вы не можете использовать array_walk() непосредственно с str2lower(), вы обязаны сначала построит с ней пользовательскую функцию, а затем передать эту функцию как аргумент.

Примечание: вместо имени функции может быть предоставлен также массив, содержащий ссылку на объект и имя метода.

Если func требует более двух или трёх аргументов, в зависимости от userdata, будет генерироваться предупреждение каждый раз, когда array_walk() вызывает func. Эти предупреждения могут подавляться путём присоединения знака ‘@’ перед вызовом array_walk() или путем использования error_reporting().

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

Модификация массива из func может дать непредсказуемое поведение.

Примечание: передача ключа и userdata в func была введена в версии 4.0.

В PHP 4 reset() должна вызываться по мере необходимости, поскольку array_walk() не восстанавливает по умолчанию значения массива.

Пользователи не могут самостоятельно изменять массив из callback-функции, например, добавлять/удалять элементы, unset массив, к которому array_walk() применяется. Если массив изменяется, поведение функции не определено.

php array_walk_recursive Разница между array_map, array_walk и array_filter

php array_walk example (4)

В чем же разница между array_map , array_walk и array_filter . Что я вижу из документации, так это то, что вы можете передать функцию обратного вызова для выполнения действия в поставляемом массиве. Но я, кажется, не обнаружил особых различий между ними.

Выполняют ли они то же самое?
Можно ли их использовать взаимозаменяемо?

Я был бы признателен за вашу помощь с иллюстративным примером, если они совсем разные.

Идея mapping функции с массивом данных исходит из функционального программирования. Вы не должны думать о array_map как о цикле foreach который вызывает функцию для каждого элемента массива (даже если это так реализовано). Это следует рассматривать как применение функции к каждому элементу в массиве независимо.

Теоретически такие вещи, как сопоставление функций, могут выполняться параллельно, поскольку функция, применяемая к данным, должна ТОЛЬКО влиять на данные и НЕ глобальное состояние. Это связано с тем, что array_map может выбрать любой порядок применения функции к элементам (хотя в PHP это не так).

array_walk с другой стороны, представляет собой совершенно противоположный подход к обработке массивов данных. Вместо того, чтобы обрабатывать каждый элемент отдельно, он использует состояние ( &$userdata ) и может редактировать элемент на месте (подобно циклу foreach). Поскольку каждый раз, когда элемент имеет $funcname применяемое к нему, он может изменять глобальное состояние программы, и для этого требуется один правильный способ обработки элементов.

Вернувшись в PHP land, array_map и array_walk почти идентичны, за исключением того, что array_walk дает вам больше контроля над итерацией данных и обычно используется для «изменения» данных на месте и возврата нового «измененного» массива.

array_filter — действительно приложение array_walk (или array_reduce ), и это более или менее просто предусмотрено для удобства.

bool array_walk (array & $ array, callback $ funcname [, mixed $ userdata]) F и изменяет его, заменяя каждый элемент x на F(x) .

array array_map (callback $ callback, array $ arr1 [, array $ . ]) F вместо преобразования элементов удалит любые элементы, для которых F(x) не является истинным


  • Изменение значений:
    • array_map не может изменять значения внутри входного массива (ов), в то время как array_walk может; в частности, array_map никогда не меняет своих аргументов.
  • Доступ к ключам доступа:
    • array_map не может работать с ключами массива, array_walk может.
  • Возвращаемое значение:
    • array_map возвращает новый массив, array_walk возвращает true / false . Следовательно, если вы не хотите создавать массив в результате прохождения одного массива, вы должны использовать array_walk .
  • Итерация нескольких массивов:
    • array_map также может получать произвольное количество массивов, и он может перебирать их параллельно, в то время как array_walk работает только на одном.
  • Передача произвольных данных в обратный вызов:
    • array_walk может получить дополнительный произвольный параметр для перехода к array_walk вызову. Это в основном не имеет значения с PHP 5.3 (когда были введены анонимные функции ).
  • Длина возвращаемого массива:
    • Результирующий массив array_map имеет ту же длину, что и массив наибольшего входного массива; array_walk не возвращает массив, но в то же время он не может изменить количество элементов исходного массива; array_filter выбирает только подмножество элементов массива в соответствии с функцией фильтрации. Он сохраняет ключи.

Следующая ревизия направлена ​​на более четкое определение массивов PHP array_filer (), array_map () и array_walk (), все из которых исходят из функционального программирования:

array_filter () отфильтровывает данные, создавая в результате новый массив, содержащий только нужные элементы предыдущего массива, следующим образом:

Все числовые значения отфильтровываются из массива $, оставляя $ filter только с фруктами.

array_map () также создает новый массив, но в отличие от array_filter () результирующий массив содержит каждый элемент входного файла $ filter, но с измененными значениями из-за применения обратного вызова к каждому элементу следующим образом:

Код в этом случае применяет обратный вызов с использованием встроенного strtoupper (), но определенная пользователем функция также является другой жизнеспособной опцией. Обратный вызов применяется к каждому элементу $ filter и тем самым порождает $ nu, чьи элементы содержат заглавные значения.

В следующем фрагменте массив walk () перемещает $ nu и вносит изменения в каждый элемент по отношению к ссылочному оператору ‘&’. Изменения происходят без создания дополнительного массива. Значение каждого элемента меняется на более информативную строку с указанием ее ключа, категории и значения.

Примечание. Функция обратного вызова по отношению к array_walk () принимает два параметра, которые автоматически получат значение элемента и его ключ и в этом порядке тоже при вызове array_walk (). (См. Больше array_walk ).

Функция array_walk()

Достаточно важная функция, позволяющая применять пользовательскую функцию к каждому элементу массива.

Как видно из синтаксиса этой функции, она применяет пользовательскую функцию func к каждому элементу массива arr. В пользовательскую функцию передаются два или три аргумента: значение текущего элемента, его индекс и аргумент userdata. Последний аргумент является необязательным. Заметим, что в случае, если func требует более трех аргументов, при каждом ее вызове будет выдаваться предупреждение, и, чтобы они не выдавались, нужно поставить знак «@» перед функцией array_walk(). Заметим также, что функция func получает значения и индексы массива arr таким образом, что не может их изменять. Если возникает такая необходимость, нужно передавать аргумент arr по ссылке. В этом случае все изменения отразятся в массиве.

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

m=>maks
i=>igor
s=>sergey


Важное замечание. Вообще говоря, в приведенном выше коде, есть, скажем так неточность. А именно – мы не установили курсор массива в начало массива, и перед тем, как вызывать функцию array_walk() надо вызывать функцию reset() для этой цели, потому что array_walk() начинает работать с того элемента, на котором находится курсор массива.

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

array_walk

(PHP 3>= 3.0.3, PHP 4)

array_walk — применяет пользовательскую функцию к каждому члену массива.

Описание

int array_walk (array array, string func [, mixed userdata])

Применяет определённую пользователем функцию func к каждому элементу массива array.
Функции func значение элемента массива будет передано как первый параметр, а ключ — как второй параметр. Если userdata предоставлен, он будет передан как третий параметр в пользовательскую функцию.
func
обязана быть определяемой пользователем функцией и не может быть встроенной функцией PHP. Таким образом, вы не можете использовать array_walk() непосредственно с str2lower(), вы обязаны сначала построит с ней пользовательскую функцию, а затем передать эту функцию как аргумент.

Примечание: вместо имени функции может быть предоставлен также массив, содержащий ссылку на объект и имя метода.

Если func требует более двух или трёх аргументов, в зависимости от userdata, будет генерироваться предупреждение каждый раз, когда array_walk() вызывает func. Эти предупреждения могут подавляться путём присоединения знака ‘@’ перед вызовом array_walk() или путем использования error_reporting().

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

Модификация массива из func может дать непредсказуемое поведение.

Примечание: передача ключа и userdata в func была введена в версии 4.0.

В PHP 4 reset() должна вызываться по мере необходимости, поскольку array_walk() не восстанавливает по умолчанию значения массива.

Пользователи не могут самостоятельно изменять массив из callback-функции, например, добавлять/удалять элементы, unset массив, к которому array_walk() применяется. Если массив изменяется, поведение функции не определено.

Ссылки на Php-5 коды array_walk().

Определение и использование. Функция array_walk() работает для каждого элемента массива в пользовательской функции. Точнее будет сказать, что функция array_walk() использует пользовательскую функцию к каждому элементу массива.

Внимание. Вы можете изменить значение элемента массива в функции пользовательской, указав первый параметр в качестве эталона: & $значение.

Внимание. Для работы с более глубокими массивами( массивов внутри массива), используйте array_walk_recursive() функцию.

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

Внимание. Множество встроенных функций (такие как strtolower()) выводят предупреждение, когда им передано больше параметров, чем они ожидают, или которые не могут непосредственно применить в funcname.

Изменения в функции array_walk() могут быть только для значения массива array. Структура массива не может быть изменена — нельзя добавить, удалить или поменять порядок элементов. Если callback-функция не соответствует этому требованию, то поведение функции array_walk() станет неопределённым и непредсказуемым.

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

Функция array_walk() применяет пользовательскую функцию funcnamevar к каждому элементу массива array.

Функция array_walk() не подвержена влиянию внутреннего указателя массива array. При этом функция array_walk() обойдёт все элементы массива независимо от позиции указателя.

Внимание. Если функция funcname требует больше параметров, чем передано на самом деле, то array_walk() будет вызывать funcname, где будет генерироваться ошибка уровня E_WARNING. Эти предупреждения подавляются добавлением оператора управления ошибками PHP @ в вызов array_walk(), или использованием error_reporting().

Для полного понимания сути данной темы написал три программы-примера, которые Вы можете изучить чуть ниже.

Параметр Описание
array Требуется. Определение массива
myfunction Требуется. Имя пользовательской функции
parameter. Необязательно. Указывает параметр пользовательской функции. Вы можете назначить один параметр функции, или, как многие, как вам нравится.

Технические данные

Возврат Значения: Возвращает TRUE в случае успеха или FALSE в случае возникновения ошибки
PHP Version: 4+

Напишем программу — Запустить каждый элемент массива в пользовательской функции:

Ключ a имеет значение red
Ключ b имеет значение green
Ключ c имеет значение blue

Напишем программу — С параметром:

Напишем программу — Изменение значения элемента массива. (Обратите внимание на & $ значение)

Илон Маск рекомендует:  Атрибуты в HTML
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL