mirror of
https://github.com/php/doc-ru.git
synced 2026-04-23 15:28:24 +02:00
92ff91d8b0
Co-authored-by: Sergey Panteleev <sergey@php.net>
314 lines
9.2 KiB
XML
314 lines
9.2 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
||
<!-- EN-Revision: e49940b757b35b8ef26bb64380c231eda7b49fc4 Maintainer: mch Status: ready -->
|
||
<!-- Reviewed: no -->
|
||
<!-- Revision: $ -->
|
||
<sect1 xml:id="control-structures.foreach" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||
<title>foreach</title>
|
||
<?phpdoc print-version-for="foreach"?>
|
||
<para>
|
||
Языковая конструкция <literal>foreach</literal> предлагает простой способ
|
||
перебора массивов. Конструкция <literal>foreach</literal> работает только с
|
||
массивами и объектами, и будет выдавать ошибку при попытке
|
||
использовать её с переменными других типов данных или неинициализированными переменными.
|
||
Разработчику доступны два вида синтаксиса:
|
||
<informalexample>
|
||
<programlisting>
|
||
<![CDATA[
|
||
foreach (iterable_expression as $value)
|
||
statement
|
||
foreach (iterable_expression as $key => $value)
|
||
statement
|
||
]]>
|
||
</programlisting>
|
||
</informalexample>
|
||
</para>
|
||
<simpara>
|
||
Первая форма обходит доступные для перебора данные, заданные
|
||
выражением <literal>iterable_expression</literal>. На каждой итерации значение
|
||
текущего элемента присваивается переменной <literal>$value</literal>.
|
||
</simpara>
|
||
<simpara>
|
||
Вторая форма дополнительно будет присваивать ключ текущего элемента
|
||
переменной <literal>$key</literal> на каждой итерации.
|
||
</simpara>
|
||
<simpara>
|
||
Обратите внимание, что конструкция <literal>foreach</literal> не изменяет внутренний указатель
|
||
массива, с которым, например, работают функции <function>current</function>
|
||
и <function>key</function>.
|
||
</simpara>
|
||
<simpara>
|
||
Разработчику доступна
|
||
<link linkend="language.oop5.iterations">настройка итерации объектов</link>.
|
||
</simpara>
|
||
|
||
<para>
|
||
Чтобы непосредственно изменять элементы массива внутри цикла,
|
||
перед переменной <literal>$value</literal> указывают знак &. Тогда
|
||
значение будет присвоено <link linkend="language.references">по ссылке</link>.
|
||
<informalexample>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
|
||
$arr = array(1, 2, 3, 4);
|
||
foreach ($arr as &$value) {
|
||
$value = $value * 2;
|
||
}
|
||
// массив $arr теперь выглядит так: array(2, 4, 6, 8)
|
||
unset($value); // разорвать ссылку на последний элемент
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</informalexample>
|
||
</para>
|
||
<warning>
|
||
<para>
|
||
Ссылка переменной <literal>$value</literal> на последний элемент массива останется даже после окончания
|
||
цикла <literal>foreach</literal>. Рекомендовано уничтожать её языковой конструкцией <function>unset</function>.
|
||
В противном случае разработчик столкнётся с таким поведением:
|
||
</para>
|
||
<informalexample>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
|
||
$arr = array(1, 2, 3, 4);
|
||
foreach ($arr as &$value) {
|
||
$value = $value * 2;
|
||
}
|
||
// $arr = array(2, 4, 6, 8)
|
||
|
||
// Без вызова конструкции unset($value), перменная $value всё ещё ссылается на последний элемент: $arr[3]
|
||
|
||
foreach ($arr as $key => $value) {
|
||
// Значение элемента $arr[3] будет обновляться значениями массива $arr при каждой итерации цикла...
|
||
echo "{$key} => {$value} ";
|
||
print_r($arr);
|
||
}
|
||
// ...до тех пор, пока предпоследнее значение не будет скопировано в последнее значение
|
||
|
||
// вывод:
|
||
// 0 => 2 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 2 )
|
||
// 1 => 4 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 4 )
|
||
// 2 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )
|
||
// 3 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</informalexample>
|
||
</warning>
|
||
<para>
|
||
Разрешено перебирать значение константного массива по ссылке:
|
||
<informalexample>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
|
||
foreach (array(1, 2, 3, 4) as &$value) {
|
||
$value = $value * 2;
|
||
}
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</informalexample>
|
||
</para>
|
||
<para>
|
||
<note>
|
||
<para>
|
||
Языковая конструкция <literal>foreach</literal> не поддерживает подавление
|
||
сообщений об ошибках через оператор <literal linkend="language.operators.errorcontrol">@</literal>.
|
||
</para>
|
||
</note>
|
||
</para>
|
||
<para>
|
||
Ещё примеры, которые показывают работу конструкции:
|
||
<informalexample>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
|
||
/* Пример 1: только значение */
|
||
|
||
$a = array(1, 2, 3, 17);
|
||
|
||
foreach ($a as $v) {
|
||
echo "Текущее значение переменной \$a: $v.\n";
|
||
}
|
||
|
||
/* Пример 2: значение (для иллюстрации массив выводится в виде значения с ключом) */
|
||
|
||
$a = array(1, 2, 3, 17);
|
||
|
||
$i = 0; /* только для пояснения */
|
||
|
||
foreach ($a as $v) {
|
||
echo "\$a[$i] => $v.\n";
|
||
$i++;
|
||
}
|
||
|
||
/* Пример 3: ключ и значение */
|
||
|
||
$a = array(
|
||
"one" => 1,
|
||
"two" => 2,
|
||
"three" => 3,
|
||
"seventeen" => 17
|
||
);
|
||
|
||
foreach ($a as $k => $v) {
|
||
echo "\$a[$k] => $v.\n";
|
||
}
|
||
|
||
/* Пример 4: многомерные массивы */
|
||
$a = array();
|
||
$a[0][0] = "a";
|
||
$a[0][1] = "b";
|
||
$a[1][0] = "y";
|
||
$a[1][1] = "z";
|
||
|
||
foreach ($a as $v1) {
|
||
foreach ($v1 as $v2) {
|
||
echo "$v2\n";
|
||
}
|
||
}
|
||
|
||
/* Пример 5: динамические массивы */
|
||
|
||
foreach (array(1, 2, 3, 4, 5) as $v) {
|
||
echo "$v\n";
|
||
}
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</informalexample>
|
||
</para>
|
||
|
||
<sect2 xml:id="control-structures.foreach.list">
|
||
<title>Распаковка вложенных массивов языковой конструкцией list()</title>
|
||
<?phpdoc print-version-for="foreach.list"?>
|
||
|
||
<para>
|
||
Доступен перебор массива массивов и распаковка
|
||
вложенного массива в переменные цикла путём передачи конструкции <function>list</function>
|
||
в качестве значения.
|
||
</para>
|
||
|
||
<para>
|
||
Например:
|
||
|
||
<informalexample>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
|
||
$array = [
|
||
[1, 2],
|
||
[3, 4],
|
||
];
|
||
|
||
foreach ($array as list($a, $b)) {
|
||
// Переменная $a содержит первый элемент вложенного массива,
|
||
// а переменная $b — второй.
|
||
echo "A: $a; B: $b\n";
|
||
}
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
&example.outputs;
|
||
<screen>
|
||
<![CDATA[
|
||
A: 1; B: 2
|
||
A: 3; B: 4
|
||
]]>
|
||
</screen>
|
||
</informalexample>
|
||
</para>
|
||
|
||
<para>
|
||
В конструкцию <function>list</function> разрешено передавать меньшее количество элементов,
|
||
чем содержится во вложенном массиве, тогда оставшиеся значения массива
|
||
будут проигнорированы:
|
||
|
||
<informalexample>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
|
||
$array = [
|
||
[1, 2],
|
||
[3, 4],
|
||
];
|
||
|
||
foreach ($array as list($a)) {
|
||
// Обратите внимание, переменной $b здесь нет.
|
||
echo "$a\n";
|
||
}
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
&example.outputs;
|
||
<screen>
|
||
<![CDATA[
|
||
1
|
||
3
|
||
]]>
|
||
</screen>
|
||
</informalexample>
|
||
</para>
|
||
|
||
<para>
|
||
Если массив содержит недостаточно элементов для заполнения переменных
|
||
в конструкции <function>list</function>, то будет сгенерировано уведомление об ошибке:
|
||
|
||
<informalexample>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
|
||
$array = [
|
||
[1, 2],
|
||
[3, 4],
|
||
];
|
||
|
||
foreach ($array as list($a, $b, $c)) {
|
||
echo "A: $a; B: $b; C: $c\n";
|
||
}
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
&example.outputs;
|
||
<screen>
|
||
<![CDATA[
|
||
|
||
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:
|
||
]]>
|
||
</screen>
|
||
</informalexample>
|
||
</para>
|
||
</sect2>
|
||
|
||
</sect1><!-- Keep this comment at the end of the file
|
||
Local variables:
|
||
mode: sgml
|
||
sgml-omittag:t
|
||
sgml-shorttag:t
|
||
sgml-minimize-attributes:nil
|
||
sgml-always-quote-attributes:t
|
||
sgml-indent-step:1
|
||
sgml-indent-data:t
|
||
indent-tabs-mode:nil
|
||
sgml-parent-document:nil
|
||
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
|
||
sgml-exposed-tags:nil
|
||
sgml-local-catalogs:nil
|
||
sgml-local-ecat-files:nil
|
||
End:
|
||
vim600: syn=xml fen fdm=syntax fdl=2 si
|
||
vim: et tw=78 syn=sgml
|
||
vi: ts=1 sw=1
|
||
-->
|