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)
The foreach construct provides an easy way to
iterate over arrays and Traversable objects.
foreach will issue an error when used with
a variable containing a different data type or with an uninitialized variable.
foreach can optionally get the key of each element:
foreach (iterable_expression as $value) {
statement_list
}
foreach (iterable_expression as $key => $value) {
statement_list
}
The first form traverses the iterable given by
iterable_expression. On each iteration, the value of
the current element is assigned to $value.
The second form will additionally assign the current element's key to
the $key variable on each iteration.
Note that foreach does not modify the internal array
pointer, which is used by functions such as current()
and key().
It is possible to customize object iteration.
Приклад #1 Common foreach usages
<?php
/* Example: value only */
$array = [1, 2, 3, 17];
foreach ($array as $value) {
echo "Current element of \$array: $value.\n";
}
/* Example: key and value */
$array = [
"one" => 1,
"two" => 2,
"three" => 3,
"seventeen" => 17
];
foreach ($array as $key => $value) {
echo "Key: $key => Value: $value\n";
}
/* Example: multi-dimensional key-value arrays */
$grid = [];
$grid[0][0] = "a";
$grid[0][1] = "b";
$grid[1][0] = "y";
$grid[1][1] = "z";
foreach ($grid as $y => $row) {
foreach ($row as $x => $value) {
echo "Value at position x=$x and y=$y: $value\n";
}
}
/* Example: dynamic arrays */
foreach (range(1, 5) as $value) {
echo "$value\n";
}
?>Зауваження:
foreachdoes not support the ability to suppress error messages using the@.
(PHP 5 >= 5.5.0, PHP 7, PHP 8)
It is possible to iterate over an array of arrays and unpack the nested array
into loop variables by using either
array destructuring
via [] or by using the list() language
construct as the value.
Зауваження: Please note that array destructuring via
[]is only possible as of PHP 7.1.0
In both of the following examples $a will be set to
the first element of the nested array and $b will
contain the second element:
<?php
$array = [
[1, 2],
[3, 4],
];
foreach ($array as [$a, $b]) {
echo "A: $a; B: $b\n";
}
foreach ($array as list($a, $b)) {
echo "A: $a; B: $b\n";
}
?>Поданий вище приклад виведе:
A: 1; B: 2 A: 3; B: 4
When providing fewer variables than there are elements in the array, the remaining elements will be ignored. Similarly, elements can be skipped over by using a comma:
<?php
$array = [
[1, 2, 5],
[3, 4, 6],
];
foreach ($array as [$a, $b]) {
// Note that there is no $c here.
echo "$a $b\n";
}
foreach ($array as [, , $c]) {
// Skipping over $a and $b
echo "$c\n";
}
?>Поданий вище приклад виведе:
1 2 3 4 5 6
A notice will be generated if there aren't enough array elements to fill the list():
<?php
$array = [
[1, 2],
[3, 4],
];
foreach ($array as [$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:
It is possible to directly modify array elements within a loop by preceding
$value with &.
In that case the value will be assigned by
reference.
<?php
$arr = [1, 2, 3, 4];
foreach ($arr as &$value) {
$value = $value * 2;
}
// $arr is now [2, 4, 6, 8]
unset($value); // break the reference with the last element
?>
Reference to a $value of the last array element
remain even after the foreach loop. It is recommended
to destroy these using unset().
Otherwise, the following behavior will occur:
<?php
$arr = [1, 2, 3, 4];
foreach ($arr as &$value) {
$value = $value * 2;
}
// $arr is now [2, 4, 6, 8]
// without an unset($value), $value is still a reference to the last item: $arr[3]
foreach ($arr as $key => $value) {
// $arr[3] will be updated with each value from $arr...
echo "{$key} => {$value} ";
print_r($arr);
}
// ...until ultimately the second-to-last value is copied onto the last value
?>Поданий вище приклад виведе:
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 )
Приклад #2 Iterate a constant array's values by reference
<?php
foreach ([1, 2, 3, 4] as &$value) {
$value = $value * 2;
}
?>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
$array = [
[1, 2, 3],
[3, 4, 6],
];
foreach ($array as [$a, $b]) {
// Observe que não existe $c aqui.
echo "$a $b\n";
}
foreach ($array as [, , $c]) {
// Pulando $a e $b
echo "$c\n";
}
?>
I would like to correct this example above!
The answer of this algorithm is:
1 2
3 4
3
6Definitely relevant for PHP 7+
1. You can't change array during iteration
Foreach WILL NOT LOOP through new values added to the array
<?php
while inside the loop.
$a = [1, 2, 3];
foreach ($a as $k => $v) {
echo $v;
if ($v === 2) {
$v[] = 4;
}
}
?>
Output: 123
But the original array was modified: [1, 2, 3, 4]
Foreach WILL LOOP through values deleted from the array while inside the loop.
<?php
$a = [1, 2, 3];
foreach ($a as $k => $v) {
echo $v;
if ($v === 2) {
unset($a[2]);
}
}
?>
Output: 123
But the original array was modified: [1, 2]
2. But If you iterate by reference using foreach ($arr as &$v) then $arr is turned into a reference and you can change it during iteration
Foreach WILL LOOP through new values added to the array while inside the loop.
<?php
$a = [1, 2, 3];
foreach ($v as &$v) {
echo $v;
if ($v === 2) {
$v[] = 4;
}
}
?>
Output: 1234
Foreach WILL NOT LOOP through values deleted from the array while inside the loop.
<?php
$a = [1, 2, 3];
foreach ($a as $k => &$v) {
echo $v;
if ($v === 2) {
unset($a[2]);
}
}
?>
Output: 12