<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.control-structures.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ru',
  ),
  'this' => 
  array (
    0 => 'control-structures.foreach.php',
    1 => 'foreach',
    2 => 'foreach',
  ),
  'up' => 
  array (
    0 => 'language.control-structures.php',
    1 => 'Управляющие конструкции',
  ),
  'prev' => 
  array (
    0 => 'control-structures.for.php',
    1 => 'for',
  ),
  'next' => 
  array (
    0 => 'control-structures.break.php',
    1 => 'break',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'language/control-structures/foreach.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="control-structures.foreach" class="sect1">
 <h2 class="title">foreach</h2>
 <p class="verinfo">(PHP 4, PHP 5, PHP 7, PHP 8)</p>
 <p class="para">
  Языковой конструкцией <code class="literal">foreach</code> удобно перебирать
  массивы (<span class="type"><a href="language.types.array.php" class="type array">array</a></span>) и объекты, классы которых реализуют интерфейс <span class="interfacename"><a href="class.traversable.php" class="interfacename">Traversable</a></span>.
  Конструкция <code class="literal">foreach</code> выдаст ошибку при попытке
  перебора переменной с другим типом данных или неинициализированной переменной.
  Разработчику доступны два вида синтаксиса:
  <div class="informalexample">
   <p class="simpara">
    Конструкция <code class="literal">foreach</code> умеет получать ключ каждого элемента, если требуется, и присваивать значение ключа переменной <code class="literal">key</code>:
   </p>
   <div class="example-contents">
<div class="cdata"><pre>
foreach (iterable_expression as $value) {
    statement_list
}

foreach (iterable_expression as $key =&gt; $value) {
    statement_list
}
</pre></div>
   </div>

  </div>
 </p>
 <p class="simpara">
  Первая форма обходит доступные для перебора данные, заданные
  выражением <code class="literal">iterable_expression</code>. На каждой итерации значение
  текущего элемента присваивается переменной <code class="literal">$value</code>.
 </p>
 <p class="simpara">
  Вторая форма дополнительно будет присваивать ключ текущего элемента
  переменной <code class="literal">$key</code> на каждой итерации.
 </p>
 <p class="simpara">
  Обратите внимание, что конструкция <code class="literal">foreach</code> не изменяет внутренний указатель
  массива, с которым, например, работают функции <span class="function"><a href="function.current.php" class="function">current()</a></span>
  и <span class="function"><a href="function.key.php" class="function">key()</a></span>.
 </p>
 <p class="simpara">
  Разработчику доступна
  <a href="language.oop5.iterations.php" class="link">настройка итерации объектов</a>.
 </p>

 <div class="example" id="example-1">
  <p><strong>Пример #1 Базовая работа с конструкцией <code class="literal">foreach</code></strong></p>
  <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #FF8000">/* Пример перебора только значений */<br /></span><span style="color: #0000BB">$array </span><span style="color: #007700">= [</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #0000BB">3</span><span style="color: #007700">, </span><span style="color: #0000BB">17</span><span style="color: #007700">];<br /><br />foreach (</span><span style="color: #0000BB">$array </span><span style="color: #007700">as </span><span style="color: #0000BB">$value</span><span style="color: #007700">) {<br />    echo </span><span style="color: #DD0000">"Значение текущего элемента массива \$array: </span><span style="color: #0000BB">$value</span><span style="color: #DD0000">.\n"</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #FF8000">/* Пример перебора ключей и значений */<br /></span><span style="color: #0000BB">$array </span><span style="color: #007700">= [<br />    </span><span style="color: #DD0000">"one" </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">1</span><span style="color: #007700">,<br />    </span><span style="color: #DD0000">"two" </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">2</span><span style="color: #007700">,<br />    </span><span style="color: #DD0000">"three" </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">3</span><span style="color: #007700">,<br />    </span><span style="color: #DD0000">"seventeen" </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">17<br /></span><span style="color: #007700">];<br /><br />foreach (</span><span style="color: #0000BB">$array </span><span style="color: #007700">as </span><span style="color: #0000BB">$key </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$value</span><span style="color: #007700">) {<br />    echo </span><span style="color: #DD0000">"Ключ: </span><span style="color: #0000BB">$key</span><span style="color: #DD0000"> =&gt; Значение: </span><span style="color: #0000BB">$value</span><span style="color: #DD0000">\n"</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #FF8000">/* Пример итерации по ключам и значениям многомерного массива */<br /></span><span style="color: #0000BB">$grid </span><span style="color: #007700">= [];<br /></span><span style="color: #0000BB">$grid</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">][</span><span style="color: #0000BB">0</span><span style="color: #007700">] = </span><span style="color: #DD0000">"a"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$grid</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">][</span><span style="color: #0000BB">1</span><span style="color: #007700">] = </span><span style="color: #DD0000">"b"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$grid</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">][</span><span style="color: #0000BB">0</span><span style="color: #007700">] = </span><span style="color: #DD0000">"y"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$grid</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">][</span><span style="color: #0000BB">1</span><span style="color: #007700">] = </span><span style="color: #DD0000">"z"</span><span style="color: #007700">;<br /><br />foreach (</span><span style="color: #0000BB">$grid </span><span style="color: #007700">as </span><span style="color: #0000BB">$y </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$row</span><span style="color: #007700">) {<br />    foreach (</span><span style="color: #0000BB">$row </span><span style="color: #007700">as </span><span style="color: #0000BB">$x </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$value</span><span style="color: #007700">) {<br />        echo </span><span style="color: #DD0000">"Значение на позиции x=</span><span style="color: #0000BB">$x</span><span style="color: #DD0000"> и y=</span><span style="color: #0000BB">$y</span><span style="color: #DD0000">: </span><span style="color: #0000BB">$value</span><span style="color: #DD0000">\n"</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #FF8000">/* Пример итерации по динамическому массиву */<br /></span><span style="color: #007700">foreach (</span><span style="color: #0000BB">range</span><span style="color: #007700">(</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">5</span><span style="color: #007700">) as </span><span style="color: #0000BB">$value</span><span style="color: #007700">) {<br />    echo </span><span style="color: #DD0000">"</span><span style="color: #0000BB">$value</span><span style="color: #DD0000">\n"</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
  </div>

 </div>
 <blockquote class="note"><p><strong class="note">Замечание</strong>: 
  <p class="para">
   Конструкция <code class="literal">foreach</code> не поддерживает
   подавление сообщений об ошибках оператором
   <a href="language.operators.errorcontrol.php" class="link"><code class="literal">@</code></a>.
  </p>
 </p></blockquote>

 <div class="sect2" id="control-structures.foreach.list">
  <h3 class="title">Распаковка вложенных массивов</h3>
  <p class="verinfo">(PHP 5 &gt;= 5.5.0, PHP 7, PHP 8)</p>
  <p class="para">
   В PHP доступна итерация по массиву массивов и распаковка вложенного массива
   в переменные цикла. Массив распаковывают либо путём
   <a href="language.types.array.php#language.types.array.syntax.destructuring" class="link">деструктуризации массива</a>
   через конструкцию <code class="literal">[]</code>, либо указывают языковую конструкцию <span class="function"><a href="function.list.php" class="function">list()</a></span>
   как значение цикла.

   <blockquote class="note"><p><strong class="note">Замечание</strong>: 
    <span class="simpara">
     <a href="language.types.array.php#language.types.array.syntax.destructuring" class="link">Деструктуризация массивов</a>
     через конструкцию <code class="literal">[]</code> возможна только с PHP 7.1.0
    </span>
   </p></blockquote>
  </p>

  <p class="para">
   <div class="informalexample">
    <p class="simpara">
     В обоих следующих примерах переменной <code class="literal">$a</code> присваивается
     первый элемент вложенного массива, а переменная <code class="literal">$b</code> получит
     второй элемент:
    </p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$array </span><span style="color: #007700">= [<br />    [</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">],<br />    [</span><span style="color: #0000BB">3</span><span style="color: #007700">, </span><span style="color: #0000BB">4</span><span style="color: #007700">],<br />];<br /><br />foreach (</span><span style="color: #0000BB">$array </span><span style="color: #007700">as [</span><span style="color: #0000BB">$a</span><span style="color: #007700">, </span><span style="color: #0000BB">$b</span><span style="color: #007700">]) {<br />    echo </span><span style="color: #DD0000">"A: </span><span style="color: #0000BB">$a</span><span style="color: #DD0000">; B: </span><span style="color: #0000BB">$b</span><span style="color: #DD0000">\n"</span><span style="color: #007700">;<br />}<br /><br />foreach (</span><span style="color: #0000BB">$array </span><span style="color: #007700">as list(</span><span style="color: #0000BB">$a</span><span style="color: #007700">, </span><span style="color: #0000BB">$b</span><span style="color: #007700">)) {<br />    echo </span><span style="color: #DD0000">"A: </span><span style="color: #0000BB">$a</span><span style="color: #DD0000">; B: </span><span style="color: #0000BB">$b</span><span style="color: #DD0000">\n"</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    
<p class="para">
 Результат выполнения приведённого примера:
</p>

    <div class="example-contents screen">
<div class="cdata"><pre>
A: 1; B: 2
A: 3; B: 4
</pre></div>
    </div>
   </div>
  </p>

  <p class="para">
   Распаковка проигнорирует оставшиеся элементы,
   если в значении цикла указали меньшее переменных, чем элементов в массиве.
   Аналогично элементы пропускают, оставляя только запятую:
   <div class="informalexample">
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$array </span><span style="color: #007700">= [<br />    [</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #0000BB">5</span><span style="color: #007700">],<br />    [</span><span style="color: #0000BB">3</span><span style="color: #007700">, </span><span style="color: #0000BB">4</span><span style="color: #007700">, </span><span style="color: #0000BB">6</span><span style="color: #007700">],<br />];<br /><br />foreach (</span><span style="color: #0000BB">$array </span><span style="color: #007700">as [</span><span style="color: #0000BB">$a</span><span style="color: #007700">, </span><span style="color: #0000BB">$b</span><span style="color: #007700">]) {<br />    </span><span style="color: #FF8000">// Обратите внимание, переменную $c не указали<br />    </span><span style="color: #007700">echo </span><span style="color: #DD0000">"</span><span style="color: #0000BB">$a</span><span style="color: #DD0000"> </span><span style="color: #0000BB">$b</span><span style="color: #DD0000">\n"</span><span style="color: #007700">;<br />}<br /><br />foreach (</span><span style="color: #0000BB">$array </span><span style="color: #007700">as [, , </span><span style="color: #0000BB">$c</span><span style="color: #007700">]) {<br />    </span><span style="color: #FF8000">// Пропускаем переменные $a и $b<br />    </span><span style="color: #007700">echo </span><span style="color: #DD0000">"</span><span style="color: #0000BB">$c</span><span style="color: #DD0000">\n"</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    
<p class="para">
 Результат выполнения приведённого примера:
</p>

    <div class="example-contents screen">
<div class="cdata"><pre>
1 2
3 4
5
6
</pre></div>
    </div>
   </div>
  </p>

  <p class="para">
   При недостаточном количестве элементов для заполнения переменных в конструкции <span class="function"><a href="function.list.php" class="function">list()</a></span>
   или конструкции с квадратными скобками генерируется уведомление:

   <div class="informalexample">
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$array </span><span style="color: #007700">= [<br />    [</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">],<br />    [</span><span style="color: #0000BB">3</span><span style="color: #007700">, </span><span style="color: #0000BB">4</span><span style="color: #007700">],<br />];<br /><br />foreach (</span><span style="color: #0000BB">$array </span><span style="color: #007700">as [</span><span style="color: #0000BB">$a</span><span style="color: #007700">, </span><span style="color: #0000BB">$b</span><span style="color: #007700">, </span><span style="color: #0000BB">$c</span><span style="color: #007700">]) {<br />    echo </span><span style="color: #DD0000">"A: </span><span style="color: #0000BB">$a</span><span style="color: #DD0000">; B: </span><span style="color: #0000BB">$b</span><span style="color: #DD0000">; C: </span><span style="color: #0000BB">$c</span><span style="color: #DD0000">\n"</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    
<p class="para">
 Результат выполнения приведённого примера:
</p>

    <div class="example-contents screen">
<div class="cdata"><pre>
Notice: Undefined offset: 2 in example.php on line 7
A: 1; B: 2; C:

Notice: Undefined offset: 2 in example.php on line 7
A: 3; B: 4; C:
</pre></div>
    </div>
   </div>
  </p>
 </div>

 <div class="sect2" id="control-structures.foreach.reference">
  <h3 class="title">Конструкция foreach и ссылки</h3>
  <p class="para">
   Элементы массива возможно напрямую модифицировать внутри цикла путём указания
   перед значением <code class="literal">$value</code> знака <code class="literal">&amp;</code>,
   тогда значение присваивается
   <a href="language.references.php" class="link">по ссылке</a>.
   <div class="informalexample">
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$arr </span><span style="color: #007700">= [</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #0000BB">3</span><span style="color: #007700">, </span><span style="color: #0000BB">4</span><span style="color: #007700">];<br />foreach (</span><span style="color: #0000BB">$arr </span><span style="color: #007700">as &amp;</span><span style="color: #0000BB">$value</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">$value </span><span style="color: #007700">= </span><span style="color: #0000BB">$value </span><span style="color: #007700">* </span><span style="color: #0000BB">2</span><span style="color: #007700">;<br />}<br /></span><span style="color: #FF8000">// Массив $arr теперь содержит значения [2, 4, 6, 8]<br /></span><span style="color: #007700">unset(</span><span style="color: #0000BB">$value</span><span style="color: #007700">); </span><span style="color: #FF8000">// Разрываем ссылочную связь с последним элементом<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </p>
  <div class="warning"><strong class="warning">Внимание</strong>
   <p class="simpara">
    Ссылка на значение <code class="literal">$value</code> последнего элемента массива
    сохраняется даже после завершения цикла <code class="literal">foreach</code>. Поэтому рекомендуют
    уничтожать ссылку конструкцией <span class="function"><a href="function.unset.php" class="function">unset()</a></span>,
    иначе возникнет следующее поведение:
   </p>
   <div class="informalexample">
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$arr </span><span style="color: #007700">= [</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #0000BB">3</span><span style="color: #007700">, </span><span style="color: #0000BB">4</span><span style="color: #007700">];<br />foreach (</span><span style="color: #0000BB">$arr </span><span style="color: #007700">as &amp;</span><span style="color: #0000BB">$value</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">$value </span><span style="color: #007700">= </span><span style="color: #0000BB">$value </span><span style="color: #007700">* </span><span style="color: #0000BB">2</span><span style="color: #007700">;<br />}<br /></span><span style="color: #FF8000">// Массив $arr теперь содержит значения [2, 4, 6, 8]<br /><br />// Без уничтожения ссылки конструкцией unset($value) переменная $value по-прежнему ссылается на последний элемент: $arr[3]<br /><br /></span><span style="color: #007700">foreach (</span><span style="color: #0000BB">$arr </span><span style="color: #007700">as </span><span style="color: #0000BB">$key </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$value</span><span style="color: #007700">) {<br />    </span><span style="color: #FF8000">// Элемент $arr[3] обновляется с каждым значением массива $arr...<br />    </span><span style="color: #007700">echo </span><span style="color: #DD0000">"</span><span style="color: #007700">{</span><span style="color: #0000BB">$key</span><span style="color: #007700">}</span><span style="color: #DD0000"> =&gt; </span><span style="color: #007700">{</span><span style="color: #0000BB">$value</span><span style="color: #007700">}</span><span style="color: #DD0000"> "</span><span style="color: #007700">;<br />    </span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$arr</span><span style="color: #007700">);<br />}<br /></span><span style="color: #FF8000">// ...пока предпоследнее значение не скопируется в последнее<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    
<p class="para">
 Результат выполнения приведённого примера:
</p>

    <div class="example-contents screen">
<div class="cdata"><pre>
0 =&gt; 2 Array ( [0] =&gt; 2, [1] =&gt; 4, [2] =&gt; 6, [3] =&gt; 2 )
1 =&gt; 4 Array ( [0] =&gt; 2, [1] =&gt; 4, [2] =&gt; 6, [3] =&gt; 4 )
2 =&gt; 6 Array ( [0] =&gt; 2, [1] =&gt; 4, [2] =&gt; 6, [3] =&gt; 6 )
3 =&gt; 6 Array ( [0] =&gt; 2, [1] =&gt; 4, [2] =&gt; 6, [3] =&gt; 6 )
</pre></div>
    </div>
   </div>
  </div>
  <div class="example" id="example-2">
  <p><strong>Пример #2 Итерация по значениям константного массива по ссылке</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">foreach ([</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #0000BB">3</span><span style="color: #007700">, </span><span style="color: #0000BB">4</span><span style="color: #007700">] as &amp;</span><span style="color: #0000BB">$value</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">$value </span><span style="color: #007700">= </span><span style="color: #0000BB">$value </span><span style="color: #007700">* </span><span style="color: #0000BB">2</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </div>

 <div class="sect2">
  <h3 class="title">Смотрите также</h3>
  <ul class="simplelist">
   <li><a href="language.types.array.php" class="link">array</a></li>
   <li><span class="interfacename"><a href="class.traversable.php" class="interfacename">Traversable</a></span></li>
   <li><a href="language.types.iterable.php" class="link">iterable</a></li>
   <li><span class="function"><a href="function.list.php" class="function">list()</a></span></li>
  </ul>
 </div>

</div><?php manual_footer($setup); ?>