首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

foreach

(PHP 4, PHP 5, PHP 7)

The foreach construct provides an easy way to iterate over arrays. foreach works only on arrays and objects, and will issue an error when you try to use it on a variable with a different data type or an uninitialized variable. There are two syntaxes:

代码语言:javascript
复制
foreach (array_expression as $value)
    statement
foreach (array_expression as $key => $value)
    statement

The first form loops over the array given by array_expression. On each iteration, the value of the current element is assigned to $value and the internal array pointer is advanced by one (so on the next iteration, you'll be looking at the next element).

The second form will additionally assign the current element's key to the $key variable on each iteration.

It is possible to customize object iteration.

Note: In PHP 5, when foreach first starts executing, the internal array pointer is automatically reset to the first element of the array. This means that you do not need to call reset() before a foreach loop. As foreach relies on the internal array pointer in PHP 5, changing it within the loop may lead to unexpected behavior. In PHP 7, foreach does not use the internal array pointer.

In order to be able to directly modify array elements within the loop precede $value with &. In that case the value will be assigned by reference.

代码语言:javascript
复制
<?php
$arr?=?array(1,?2,?3,?4);
foreach?($arr?as?&$value)?{
????$value?=?$value?*?2;
}
//?$arr?is?now?array(2,?4,?6,?8)
unset($value);?//?break?the?reference?with?the?last?element
?>

Warning

Reference of a $value and the last array element remain even after the foreach loop. It is recommended to destroy it by unset(). Otherwise you will experience the following behavior:

代码语言:javascript
复制
<?php
$arr?=?array(1,?2,?3,?4);
foreach?($arr?as?&$value)?{
????$value?=?$value?*?2;
}
//?$arr?is?now?array(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

//?output:
//?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?)
?>

Before PHP 5.5.0, referencing $value is only possible if the iterated array can be referenced (i.e. if it is a variable). The following code works only as of PHP 5.5.0:

代码语言:javascript
复制
<?php
foreach?(array(1,?2,?3,?4)?as?&$value)?{
????$value?=?$value?*?2;
}
?>

Note: foreach does not support the ability to suppress error messages using '@'.

You may have noticed that the following are functionally identical:

代码语言:javascript
复制
<?php
$arr?=?array("one",?"two",?"three");
reset($arr);
while?(list(,?$value)?=?each($arr))?{
????echo?"Value:?$value<br?/>\n";
}

foreach?($arr?as?$value)?{
????echo?"Value:?$value<br?/>\n";
}
?>

The following are also functionally identical:

代码语言:javascript
复制
<?php
$arr?=?array("one",?"two",?"three");
reset($arr);
while?(list($key,?$value)?=?each($arr))?{
????echo?"Key:?$key;?Value:?$value<br?/>\n";
}

foreach?($arr?as?$key?=>?$value)?{
????echo?"Key:?$key;?Value:?$value<br?/>\n";
}
?>

Some more examples to demonstrate usage:

代码语言:javascript
复制
<?php
/*?foreach?example?1:?value?only?*/

$a?=?array(1,?2,?3,?17);

foreach?($a?as?$v)?{
????echo?"Current?value?of?\$a:?$v.\n";
}

/*?foreach?example?2:?value?(with?its?manual?access?notation?printed?for?illustration)?*/

$a?=?array(1,?2,?3,?17);

$i?=?0;?/*?for?illustrative?purposes?only?*/

foreach?($a?as?$v)?{
????echo?"\$a[$i]?=>?$v.\n";
????$i++;
}

/*?foreach?example?3:?key?and?value?*/

$a?=?array(
????"one"?=>?1,
????"two"?=>?2,
????"three"?=>?3,
????"seventeen"?=>?17
);

foreach?($a?as?$k?=>?$v)?{
????echo?"\$a[$k]?=>?$v.\n";
}

/*?foreach?example?4:?multi-dimensional?arrays?*/
$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";
????}
}

/*?foreach?example?5:?dynamic?arrays?*/

foreach?(array(1,?2,?3,?4,?5)?as?$v)?{
????echo?"$v\n";
}
?>

Unpacking nested arrays with list()

(PHP 5 >= 5.5.0, PHP 7)

PHP 5.5 added the ability to iterate over an array of arrays and unpack the nested array into loop variables by providing a list() as the value.

For example:

代码语言:javascript
复制
<?php
$array?=?[
????[1,?2],
????[3,?4],
];

foreach?($array?as?list($a,?$b))?{
????//?$a?contains?the?first?element?of?the?nested?array,
????//?and?$b?contains?the?second?element.
????echo?"A:?$a;?B:?$b\n";
}
?>

The above example will output:

代码语言:javascript
复制
A: 1; B: 2
A: 3; B: 4

You can provide fewer elements in the list() than there are in the nested array, in which case the leftover array values will be ignored:

代码语言:javascript
复制
<?php
$array?=?[
????[1,?2],
????[3,?4],
];

foreach?($array?as?list($a))?{
????//?Note?that?there?is?no?$b?here.
????echo?"$a\n";
}
?>

The above example will output:

代码语言:javascript
复制
1
3

A notice will be generated if there aren't enough array elements to fill the list():

代码语言:javascript
复制
<?php
$array?=?[
????[1,?2],
????[3,?4],
];

foreach?($array?as?list($a,?$b,?$c))?{
????echo?"A:?$a;?B:?$b;?C:?$c\n";
}
?>

The above example will output:

代码语言:javascript
复制
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: 

Changelog

Version

Description

7.0.0

foreach does not use the internal array pointer anymore.

5.5.0

Referencing of $value is supported for expressions. Formerly, only variables have been supported.

5.5.0

Unpacking nested arrays with list() is supported.

← for

break →

代码语言:txt
复制
 ? 1997–2017 The PHP Documentation Group

Licensed under the Creative Commons Attribution License v3.0 or later.

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com