﻿<h1 class=p1>Функция array_walk()</h1>
<br><br>

<a name=1></a>
<h1 class=p1>array_walk()</h1>
<p class=text>Достаточно важная функция, позволяющая применять пользовательскую функцию к каждому элементу массива.</p>
<p class=prim><b><i>Синтаксис:</i></b></p>
<blockquote><pre>
bool <b>array_walk</b><em class=gr>(</em>array <b>arr</b>, callback <b>func</b> [, mixed <b>userdata</b>]<em class=gr>)</em>
</pre></blockquote>
<p class=text>Как видно из синтаксиса этой функции, она применяет пользовательскую функцию <b>func</b> к каждому элементу массива <b>arr</b>. В пользовательскую функцию передаются два или три аргумента: значение текущего элемента, его индекс и аргумент <b>userdata</b>. Последний аргумент является необязательным. Заметим, что в случае, если <b>func</b> требует более трех аргументов, при каждом ее вызове будет выдаваться предупреждение, и, чтобы они не выдавались, нужно поставить знак "<b>@</b>" перед функцией <b>array_walk</b>(). Заметим также, что функция <b>func</b> получает значения и индексы массива <b>arr</b> таким образом, что не может их изменять. Если возникает такая необходимость, нужно передавать аргумент <b>arr</b> по ссылке. В этом случае все изменения отразятся в массиве.</p>
<p class=text>Давайте посмотрим, как эта функция применяется. Допустим, мы хотим вывести все элементы массива. Для этого мы должны сначала написать функцию, которая будет  их выводить, а затем вызовем ее при помощи функции <b>array_walk</b>():</p>
<p class=prim><b><i>Пример:</i></b></p>
<blockquote><pre>
<em class=red>&lt;?</em>
   <b>$name</b> <em class=gr>=</em> array <em class=gr>(</em>"m"=>"maks", "i"=>"igor", "s"=>"sergey"<em class=gr>);</em>
   function print_array <em class=gr>(</em><b>$item</b>, <b>$key</b><em class=gr>)
   {
      echo</em> "<b>$key</b><em class=gr>=></em><b>$item</b>&lt;<b>br</b>>\n"<em class=gr>;
   }</em>
   array_walk <em class=gr>(</em><b>$name</b>, 'print_array'<em class=gr>);</em>
<em class=red>?&gt;</em>
</pre></blockquote>
<p class=text>И что вышло:</p>
<p class=prim><b><i>Результат:</i></b></p>
<table class="color1" width="100%" cellpadding="12" ><tr><td>
m=>maks<br>
i=>igor<br>
s=>sergey<br>
</td></tr></table>
<br>
<p class=text>Важное замечание. Вообще говоря, в приведенном выше коде, есть, скажем так неточность. А именно – мы не установили курсор массива в начало массива, и перед тем, как вызывать функцию <b>array_walk</b>() надо вызывать функцию <b>reset</b>() для этой цели, потому что <b>array_walk</b>() начинает работать с того элемента, на котором находится курсор массива.</p>
<p class=text>Давайте теперь возьмем массив, и увеличим значения каждого его элемента на единицу.</p>
<p class=prim><b><i>Пример:</i></b></p>
<blockquote><pre>
<em class=red>&lt;?</em>
   <b>$number</b> <em class=gr>=</em> array <em class=gr>(</em>"1"=>"15", "2"=>"20", "3"=>"25"<em class=gr>);</em>
   function printarray <em class=gr>(</em><b>$item</b>, <b>$key</b><em class=gr>) 
   {
      echo</em> "<b>$key</b>=><b>$item</b>&lt;<b>br</b>>\n"<em class=gr>;
   }</em>
   function add_array <em class=gr>(</em>&<b>$item</b>, <b>$key</b><em class=gr>)</em> 
   <em class=comnt>// параметр $item передаем по ссылке, так как</em>            
   <em class=comnt>// его нам надо изменять
   {</em>
      <b>$item</b> <em class=gr>=</em> <b>$item</b> + 1<em class=gr>;
   }
   echo(</em>"Before:&lt;<b>br</b>>"<em class=gr>);</em>
   array_walk <em class=gr>(</em><b>$number</b>, 'printarray'<em class=gr>);
   echo(</em>"After:&lt;<b>br</b>>"<em class=gr>);</em>
   array_walk <em class=gr>(</em><b>$number</b>, 'add_array'<em class=gr>);</em>
   array_walk <em class=gr>(</em><b>$number</b>, 'printarray'<em class=gr>);</em>
<em class=red>?&gt;</em>
</pre></blockquote>
<p class=prim><b><i>Результат:</i></b></p>
<table class="color1" width="100%" cellpadding="12" ><tr><td>
Before:<br>1=>15<br>
2=>20<br>
3=>25<br>
After:<br>1=>16<br>
2=>21<br>
3=>26<br>
</td></tr></table>
