An easier way to unpack nested array elements
$array = [
[1, 2],
[3, 4],
];
foreach ($array as [$a, $b]) {
echo "A: $a; B: $b\n";
}
(PHP 4, PHP 5, PHP 7, PHP 8)
Конструкция foreach
предоставляет простой способ
перебора массивов. foreach
работает только с
массивами и объектами, и будет генерировать ошибку при попытке
использования с переменными других типов или неинициализированными переменными.
Существует два вида синтаксиса:
foreach (iterable_expression as $value) statement foreach (iterable_expression as $key => $value) statement
Первый цикл перебирает массив, задаваемый с помощью
iterable_expression
. На каждой итерации значение
текущего элемента присваивается переменной $value
.
Второй цикл дополнительно присвоит ключ текущего элемента
переменной $key
на каждой итерации.
Обратите внимание, что foreach
не изменяет указатель внутреннего
массива, который используется такими функциями, как current()
и key().
Возможно настроить итераторы объектов.
Для того, чтобы напрямую изменять элементы массива внутри цикла,
переменной $value
должен предшествовать знак &. В этом случае
значение будет присвоено по ссылке.
<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
$value = $value * 2;
}
// массив $arr сейчас таков: array(2, 4, 6, 8)
unset($value); // разорвать ссылку на последний элемент
?>
Ссылка $value
на последний элемент массива останется после окончания
цикла foreach
. Рекомендуется уничтожать её с помощью unset().
В противном случае вы можете столкнуться с таким поведением:
<?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);
}
// ...И в конце концов предпоследнее значение определит окончательное содержимое $arr[3]
// вывод:
// 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 )
?>
Можно перебирать значение постоянного массива по ссылке:
<?php
foreach (array(1, 2, 3, 4) as &$value) {
$value = $value * 2;
}
?>
Замечание:
Оператор
foreach
не поддерживает возможность подавления сообщений об ошибках с помощью префикса@
.
Ещё несколько примеров, демонстрирующие использование оператора:
<?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";
}
?>
(PHP 5 >= 5.5.0, PHP 7, PHP 8)
Можно перебрать массив массивов и распаковать вложенный массив в переменные цикла, передав list() в качестве значения.
Например:
<?php
$array = [
[1, 2],
[3, 4],
];
foreach ($array as list($a, $b)) {
// $a содержит первый элемент вложенного массива,
// а $b содержит второй элемент.
echo "A: $a; B: $b\n";
}
?>
Результат выполнения данного примера:
A: 1; B: 2 A: 3; B: 4
Можно передавать меньшее количество элементов в list(), чем находится во вложенном массиве, в этом случае оставшиеся значения массива будут проигнорированы:
<?php
$array = [
[1, 2],
[3, 4],
];
foreach ($array as list($a)) {
// Обратите внимание на отсутствие $b.
echo "$a\n";
}
?>
Результат выполнения данного примера:
1 3
Если массив содержит недостаточно элементов для заполнения всех переменных из list(), то будет сгенерировано замечание об ошибке:
<?php
$array = [
[1, 2],
[3, 4],
];
foreach ($array as list($a, $b, $c)) {
echo "A: $a; B: $b; C: $c\n";
}
?>
Результат выполнения данного примера:
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:
An easier way to unpack nested array elements
$array = [
[1, 2],
[3, 4],
];
foreach ($array as [$a, $b]) {
echo "A: $a; B: $b\n";
}
destructure array elements
you can unpac nested array elements using the following
<?php
$array = [
[1, 2],
[3, 4],
];
foreach ($array as $v) {
[$a, $b] = $v;
echo "A: $a; B: $b\n";
}
?>
For an array, foreach presents the elements of the array in the order that they were added to the array. For example, if you need to have the elements presented in ascending order by key, use the ksort function to rearrange the elements of the array in key sequence.
This behavior is a result of the way that PHP arrays are stored. foreach merely presents the elements of an array in the order that they are stored within the array.