each、foreach、list在遍历数组时的结合运用

来源:互联网 发布:亚像素边缘提取算法 编辑:程序博客网 时间:2024/06/07 22:25

**

each

**

(PHP 4, PHP 5, PHP 7)

each — 返回数组中当前的键/值对并将数组指针向前移动一步

说明

array each ( array &$array )

返回数组中当前的键/值对并将数组指针向前移动一步

在执行 each() 之后,数组指针将停留在数组中的下一个单元或者当碰到数组结尾时停留在最后一个单元。如果要再用 each 遍历数组,必须使用 reset()

参数

array
输入的数组。

返回值

返回 array 数组中当前指针位置的键/值对并向前移动数组指针。键值对被返回为四个单元的数组,键名为0,1,key和 value。单元 0 和 key 包含有数组单元的键名,1 和 value 包含有数据。

如果内部指针越过了数组的末端,则 each() 返回 FALSE。

范例

Example #1 each() 例子

<?php$foo = array("bob", "fred", "jussi", "jouni", "egon", "marliese");$bar = each($foo);print_r($bar);?>  

$bar 现在包含有如下的键/值对:

Array(    [1] => bob    [value] => bob    [0] => 0    [key] => 0)
<?php$foo = array("Robert" => "Bob", "Seppo" => "Sepi");$bar = each($foo);print_r($bar);?>  

$bar 现在包含有如下的键/值对:

Array(    [1] => Bob    [value] => Bob    [0] => Robert    [key] => Robert)

each() 经常和 list() 结合使用来遍历数组,例如:

Example #2 用 each() 遍历数组

<?php$fruit = array('a' => 'apple', 'b' => 'banana', 'c' => 'cranberry');reset($fruit);while (list($key, $val) = each($fruit)) {    echo "$key => $val\n";}?>  

以上例程会输出:

a => appleb => bananac => cranberry

Caution
因为将一个数组赋值给另一个数组时会重置原来的数组指针,因此在上边的例子中如果我们在循环内部将 $fruit 赋给了另一个变量的话将会导致无限循环。

Warning

each() will also accept objects, but may return unexpected results. Its therefore not recommended to iterate though object properties with each(). 

foreach


(PHP 4, PHP 5, PHP 7)

foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。有两种语法:

foreach (array_expression as $value)    statementforeach (array_expression as $key => $value)    statement

第一种格式遍历给定的 array_expression 数组。每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步(因此下一次循环中将会得到下一个单元)。

第二种格式做同样的事,只除了当前单元的键名也会在每次循环中被赋给变量 $key。

还能够自定义遍历对象。

Note:

当 foreach 开始执行时,数组内部的指针会自动指向第一个单元。这意味着不需要在 foreach 循环之前调用 reset()。

由于 foreach 依赖内部数组指针,在循环中修改其值将可能导致意外的行为。

可以很容易地通过在 $value 之前加上 & 来修改数组的元素。此方法将以引用赋值而不是拷贝一个值。

<?php$arr = array(1, 2, 3, 4);foreach ($arr as &$value) {    $value = $value * 2;}// $arr is now array(2, 4, 6, 8)unset($value); // 最后取消掉引用?>  

$value 的引用仅在被遍历的数组可以被引用时才可用(例如是个变量)。以下代码则无法运行:

<?phpforeach (array(1, 2, 3, 4) as &$value) {    $value = $value * 2;}?>  

Warning
数组最后一个元素的 $value 引用在 foreach 循环之后仍会保留。建议使用 unset() 来将其销毁。

Note:

foreach 不支持用”@”来抑制错误信息的能力。

用户可能注意到了以下的代码功能完全相同:

<?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";}?>  

以下代码功能也完全相同:

<?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";}?>  

示范用法的更多例子:

<?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";}?>  

用 list() 给嵌套的数组解包

(PHP 5 >= 5.5.0, PHP 7)

PHP 5.5 增添了遍历一个数组的数组的功能并且把嵌套的数组解包到循环变量中,只需将 list() 作为值提供。

例如:

*<?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";}?>*  

以上例程会输出:

A: 1; B: 2
A: 3; B: 4

list() 中的单元可以少于嵌套数组的,此时多出来的数组单元将被忽略:

<?php$array = [    [1, 2],    [3, 4],];foreach ($array as list($a)) {    // Note that there is no $b here.    echo "$a\n";}?>  

以上例程会输出:

1
3

如果 list() 中列出的单元多于嵌套数组则会发出一条消息级别的错误信息:

<?php$array = [    [1, 2],    [3, 4],];foreach ($array as list($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:

阅读全文
1 0
原创粉丝点击