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 ΡΠ΄ΠΎΠ±Π½ΠΎ ΠΏΠ΅ΡΠ΅Π±ΠΈΡΠ°ΡΡ
ΠΌΠ°ΡΡΠΈΠ²Ρ (array) ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΡ, ΠΊΠ»Π°ΡΡΡ ΠΊΠΎΡΠΎΡΡΡ
ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Traversable.
ΠΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ foreach Π²ΡΠ΄Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΡ ΠΏΡΠΈ ΠΏΠΎΠΏΡΡΠΊΠ΅
ΠΏΠ΅ΡΠ΅Π±ΠΎΡΠ° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ Π΄ΡΡΠ³ΠΈΠΌ ΡΠΈΠΏΠΎΠΌ Π΄Π°Π½Π½ΡΡ
ΠΈΠ»ΠΈ Π½Π΅ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ.
Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΡ Π΄ΠΎΡΡΡΠΏΠ½Ρ Π΄Π²Π° Π²ΠΈΠ΄Π° ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ°:
ΠΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ foreach ΡΠΌΠ΅Π΅Ρ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΠΊΠ»ΡΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°, Π΅ΡΠ»ΠΈ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ, ΠΈ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠ»ΡΡΠ° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ key:
foreach (iterable_expression as $value) {
statement_list
}
foreach (iterable_expression as $key => $value) {
statement_list
}
ΠΠ΅ΡΠ²Π°Ρ ΡΠΎΡΠΌΠ° ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΡ Π΄ΠΎΡΡΡΠΏΠ½ΡΠ΅ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π±ΠΎΡΠ° Π΄Π°Π½Π½ΡΠ΅, Π·Π°Π΄Π°Π½Π½ΡΠ΅
Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ iterable_expression. ΠΠ° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅
ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π΅ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ $value.
ΠΡΠΎΡΠ°Ρ ΡΠΎΡΠΌΠ° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°ΡΡ ΠΊΠ»ΡΡ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°
ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ $key Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ.
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ foreach Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅Ρ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ
ΠΌΠ°ΡΡΠΈΠ²Π°, Ρ ΠΊΠΎΡΠΎΡΡΠΌ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ current()
ΠΈ key().
Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΡ Π΄ΠΎΡΡΡΠΏΠ½Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠ° ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ².
ΠΡΠΈΠΌΠ΅Ρ #1 ΠΠ°Π·ΠΎΠ²Π°Ρ ΡΠ°Π±ΠΎΡΠ° Ρ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠ΅ΠΉ foreach
<?php
/* ΠΡΠΈΠΌΠ΅Ρ ΠΏΠ΅ΡΠ΅Π±ΠΎΡΠ° ΡΠΎΠ»ΡΠΊΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ */
$array = [1, 2, 3, 17];
foreach ($array as $value) {
echo "ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΌΠ°ΡΡΠΈΠ²Π° \$array: $value.\n";
}
/* ΠΡΠΈΠΌΠ΅Ρ ΠΏΠ΅ΡΠ΅Π±ΠΎΡΠ° ΠΊΠ»ΡΡΠ΅ΠΉ ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ */
$array = [
"one" => 1,
"two" => 2,
"three" => 3,
"seventeen" => 17
];
foreach ($array as $key => $value) {
echo "ΠΠ»ΡΡ: $key => ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅: $value\n";
}
/* ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΠΎ ΠΊΠ»ΡΡΠ°ΠΌ ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌ ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΌΠ°ΡΡΠΈΠ²Π° */
$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 "ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΠΎΠ·ΠΈΡΠΈΠΈ x=$x ΠΈ y=$y: $value\n";
}
}
/* ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΠΎ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΌΡ ΠΌΠ°ΡΡΠΈΠ²Ρ */
foreach (range(1, 5) as $value) {
echo "$value\n";
}
?>ΠΠ°ΠΌΠ΅ΡΠ°Π½ΠΈΠ΅:
ΠΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ
foreachΠ½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΏΠΎΠ΄Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠΌ@.
(PHP 5 >= 5.5.0, PHP 7, PHP 8)
Π PHP Π΄ΠΎΡΡΡΠΏΠ½Π° ΠΈΡΠ΅ΡΠ°ΡΠΈΡ ΠΏΠΎ ΠΌΠ°ΡΡΠΈΠ²Ρ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ² ΠΈ ΡΠ°ΡΠΏΠ°ΠΊΠΎΠ²ΠΊΠ° Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΌΠ°ΡΡΠΈΠ²Π°
Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠΈΠΊΠ»Π°. ΠΠ°ΡΡΠΈΠ² ΡΠ°ΡΠΏΠ°ΠΊΠΎΠ²ΡΠ²Π°ΡΡ Π»ΠΈΠ±ΠΎ ΠΏΡΡΡΠΌ
Π΄Π΅ΡΡΡΡΠΊΡΡΡΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠ°ΡΡΠΈΠ²Π°
ΡΠ΅ΡΠ΅Π· ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ [], Π»ΠΈΠ±ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ ΡΠ·ΡΠΊΠΎΠ²ΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ list()
ΠΊΠ°ΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠΊΠ»Π°.
ΠΠ°ΠΌΠ΅ΡΠ°Π½ΠΈΠ΅: ΠΠ΅ΡΡΡΡΠΊΡΡΡΠΈΠ·Π°ΡΠΈΡ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ² ΡΠ΅ΡΠ΅Π· ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ
[]Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ΡΠΎΠ»ΡΠΊΠΎ Ρ PHP 7.1.0
Π ΠΎΠ±ΠΎΠΈΡ
ΡΠ»Π΅Π΄ΡΡΡΠΈΡ
ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ
ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ $a ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π΅ΡΡΡ
ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΌΠ°ΡΡΠΈΠ²Π°, Π° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ $b ΠΏΠΎΠ»ΡΡΠΈΡ
Π²ΡΠΎΡΠΎΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ:
<?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
Π Π°ΡΠΏΠ°ΠΊΠΎΠ²ΠΊΠ° ΠΏΡΠΎΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅Ρ ΠΎΡΡΠ°Π²ΡΠΈΠ΅ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ, Π΅ΡΠ»ΠΈ Π² Π·Π½Π°ΡΠ΅Π½ΠΈΠΈ ΡΠΈΠΊΠ»Π° ΡΠΊΠ°Π·Π°Π»ΠΈ ΠΌΠ΅Π½ΡΡΠ΅Π΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ , ΡΠ΅ΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π² ΠΌΠ°ΡΡΠΈΠ²Π΅. ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΏΡΠΎΠΏΡΡΠΊΠ°ΡΡ, ΠΎΡΡΠ°Π²Π»ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π·Π°ΠΏΡΡΡΡ:
<?php
$array = [
[1, 2, 5],
[3, 4, 6],
];
foreach ($array as [$a, $b]) {
// ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ $c Π½Π΅ ΡΠΊΠ°Π·Π°Π»ΠΈ
echo "$a $b\n";
}
foreach ($array as [, , $c]) {
// ΠΡΠΎΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ $a ΠΈ $b
echo "$c\n";
}
?>Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°:
1 2 3 4 5 6
ΠΡΠΈ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π΄Π»Ρ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π² ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ 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:
ΠΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΌΠ°ΡΡΠΈΠ²Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΡΡΠΌΡΡ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ Π²Π½ΡΡΡΠΈ ΡΠΈΠΊΠ»Π° ΠΏΡΡΡΠΌ ΡΠΊΠ°Π·Π°Π½ΠΈΡ
ΠΏΠ΅ΡΠ΅Π΄ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ $value Π·Π½Π°ΠΊΠ° &,
ΡΠΎΠ³Π΄Π° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π΅ΡΡΡ
ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅.
<?php
$arr = [1, 2, 3, 4];
foreach ($arr as &$value) {
$value = $value * 2;
}
// ΠΠ°ΡΡΠΈΠ² $arr ΡΠ΅ΠΏΠ΅ΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ [2, 4, 6, 8]
unset($value); // Π Π°Π·ΡΡΠ²Π°Π΅ΠΌ ΡΡΡΠ»ΠΎΡΠ½ΡΡ ΡΠ²ΡΠ·Ρ Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠΌ
?>
Π‘ΡΡΠ»ΠΊΠ° Π½Π° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ $value ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΌΠ°ΡΡΠΈΠ²Π°
ΡΠΎΡ
ΡΠ°Π½ΡΠ΅ΡΡΡ Π΄Π°ΠΆΠ΅ ΠΏΠΎΡΠ»Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΡΠΈΠΊΠ»Π° foreach. ΠΠΎΡΡΠΎΠΌΡ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡΡ
ΡΠ½ΠΈΡΡΠΎΠΆΠ°ΡΡ ΡΡΡΠ»ΠΊΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠ΅ΠΉ unset(),
ΠΈΠ½Π°ΡΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅:
<?php
$arr = [1, 2, 3, 4];
foreach ($arr as &$value) {
$value = $value * 2;
}
// ΠΠ°ΡΡΠΈΠ² $arr ΡΠ΅ΠΏΠ΅ΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ [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 )
ΠΡΠΈΠΌΠ΅Ρ #2 ΠΡΠ΅ΡΠ°ΡΠΈΡ ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΠΎΠ³ΠΎ ΠΌΠ°ΡΡΠΈΠ²Π° ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅
<?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";
}The following C code mimics the reference leak behavior of a by-reference foreach loop in PHP. By intentionally leaving current pointing to the last element after the first loop, we can reproduce the same silent array corruption that occurs in PHP.
#include <stdio.h>
int main()
{
int arr[] = {1, 2, 3, 4};
int *current;
//First Loop doubles the array
for (size_t i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
//arr[i] === *(arr + i)
arr[i] *= 2;
current = arr + i;
printf("Current modified:%d\n", *current);
}
/*
After the loop completes, the arr is now {2,4,6,8}.
As for current, it is going to have the memory location of the last element (memory location of 8).
*/
for (size_t i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
/*
In each iteration, the memory location of 8 is going to be dereferenced and set to arr[i].
As a result, the last value will be equal to the value before it
*/
*current = arr[i];
printf("Current:%d\n", *current);
}
return 0;
}
Just as PHP's $value remains a reference to the last element after a by-reference foreach, current here remains a pointer to arr[3]. Every iteration of the second loop writes into arr[3], ultimately copying the second-to-last value onto the last element.Definitely 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<?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
6As well as numerically-indexed arrays, nested associative arrays can also be unnested in the foreach()
<?php
$records = [
['name' => 'Alice', 'address' => '...'],
['name' => 'Bob', 'address' => '...'],
['name' => 'Chris', 'address' => '...'],
...];
foreach($records as ['name' => $name]) {
echo "$name\n";
}
foreach($records as ['address' => $address, 'name' => $name]) {
echo "$name @ $address\n";
}
?>
The usual warnings about undefined array keys will occur if any of the element arrays lack the requested key.
One additional detail, the key is still just an ordinary string-valued expression, so...
<?php
$field = 'address';
foreach($records as [$field => $value]) {
echo "$value\n";
}
?>
If the value of $field changed within the loop, the new field would be accessed in subsequent iterations.