An easier way to unpack nested array elements
$array = [
[1, 2],
[3, 4],
];
foreach ($array as [$a, $b]) {
echo "A: $a; B: $b\n";
}foreach
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
foreach
Референца за `control-structures.foreach.php` со подобрена типографија и навигација.
foreach
(PHP 4, PHP 5, PHP 7, PHP 8)
На foreach конструкторот обезбедува лесен начин за итерирање преку arrayи Траверзабилно objects.
foreach конструкцијата обезбедува лесен начин за итерирање преку
foreach ќе издаде грешка кога се користи со променлива што содржи различен тип на податоци или со неиницијализирана променлива. key може опционално да го добие
foreach (iterable_expression as $value) {
statement_list
}
foreach (iterable_expression as $key => $value) {
statement_list
}
на секој елемент:
iterable_expressionПрвата форма поминува низ итерабилниот објект даден од $value.
. На секоја итерација, вредноста на тековниот елемент се доделува на $key Втората форма дополнително ќе ја додели клучот на тековниот елемент на
Имајте предвид дека foreach променлива на секоја итерација. current()
and key().
Како и променливите, опсегот на константа е глобален. Константите може да се пристапат од било каде во скрипта без оглед на опсегот. За повеќе информации за опсегот, прочитајте го делот од прирачникот за опсегот на променливите. не го менува внатрешниот покажувач на низата, кој се користи од функции како.
прилагоди итерација на објекти 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";
}
?>Забелешка:
foreachПример #1 Вообичаено@.
не поддржува можност за потиснување на пораки за грешки користејќи
Распакување на вгнездени низи
(PHP 5 >= 5.5.0, PHP 7, PHP 8)
Можно е да се итерира преку низа од низи и да се распакуваат вгнездените низи во променливи на циклусот со користење на
via [] распакување на низи list() или со користење на
Забелешка: конструкцијата како вредност. Можно е да се итерира преку низа од низи и да се распакуваат вгнездените низи во променливи на циклусот со користење на via
[]Ве молиме имајте предвид дека
Во двата следни примери $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";
}
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
A: 1; B: 2 A: 3; B: 4
Кога се обезбедуваат помалку променливи отколку што има елементи во низата, преостанатите елементи ќе бидат игнорирани. Слично, елементите може да се прескокнат со користење запирка:
<?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 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
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";
}
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
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 with &. Во тој случај вредноста ќе биде доделена од
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
?>
Референца до $value од последниот елемент од низата остануваат дури и по foreach јамка. Се препорачува да се уништат овие со користење unset(). Во спротивно, ќе се случи следното однесување:
<?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
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
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 белешки
<?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
6The 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.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.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