foreach

(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:

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ foreach ΠΈ ссылки

Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ массива Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ†ΠΈΠΊΠ»Π° ΠΏΡƒΡ‚Ρ‘ΠΌ указания ΠΏΠ΅Ρ€Π΅Π΄ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ $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;
}

?>

Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅

οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ 5 notes

up
3
mohammed dot abdulaziz dot business at gmail dot com ΒΆ
3 months ago
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.
up
46
Okafor Chiagozie ΒΆ
3 years ago
An easier way to unpack nested array elements

$array = [
    [1, 2],
    [3, 4],
];

foreach ($array as [$a, $b]) {
    echo "A: $a; B: $b\n";
}
up
1
sunfundev at gmail dot com ΒΆ
7 months ago
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
up
5
renatoaraujoleal at gmail dot com ΒΆ
1 year ago
<?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
6
up
0
harl at gmail dot com ΒΆ
6 months ago
As 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.