php使用foreach来遍历操作数组

时间:2017-07-27
PHP foreach() 语法结构用于遍历操作或输出数组,foreach() 仅能用于遍历数组或对象,当试图将其用于其它数据类型或者一个未初始化的变量时会产生错误。本文章向大家介绍php foreach遍历数组的用法和实例。

PHP 4以上的版本包括了 foreach 结构,这只是一种遍历数组简便方法。foreach 仅能用于数组,当试图将其用于其它数据类型或者一个未初始化的变量时会产生错误。有两种语法,第二种是第一种的有用的扩展。

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

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

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

PHP foreach() 程序实例:

实例一:

值使用数组的值。

<?php
echo "foreach example 1: value only ".'<br />';
$a = array(1, 2, 3, 17);
foreach ($a as $v) {
   echo "Current value of ".$a.":". $v."<br />";
}
?>
运行结果
foreach example 1: value only 
Current value of $a: 1
Current value of $a: 2
Current value of $a: 3
Current value of $a: 17

实例二:

使用键和值

echo '<br />'.'<br />'."foreach example 3: key and value ".'<br />';
$a = array(
    "one" => 1,
    "two" => 2,
    "three" => 3,
    "seventeen" => 17
);
foreach ($a as $k => $v) {
    echo ""$a[$k] => $v".'<br />';
}
程序运行结果
foreach example 3: key and value 
$a[one] => 1
$a[two] => 2
$a[three] => 3
$a[seventeen] => 17

实例三:

一二维数组混合的例子

$arr_age = array("wang"=>18, "li"=>20, "zhang"=>array("name"=>"小张", "age"=>25));
foreach ($arr_age as $age) {
    if(is_array($age)){
        foreach ( $age as $detail) {
        echo $detail,'<br />';
        }
    } else {
        echo $age,'<br />';
    }
}
?>

运行该例子输出:

18
20
小张
25

对多维数组的遍历处理就要根据实际的数据结构而采取最合适的处理方式。

PHP foreach 需要的三点

1. foreach 中使用引用的情况。

普通情况下,foreach($arr as $value)中的$arr和$value是拷贝,不受外部影响的,即

$arr = array(0,1,2,3,4,5);
foreach($arr as $value){
    $arr = array();
    echo $value;
}

结果是:12345

但如果$arr是引用的话,情况则不同了,我们用代码来说明问题

$arr = array(0,1,2,3,4,5);
$arr = &$arr;
foreach($arr as $value){
    $arr = array();
    echo $value;
}

结果是: 0

这是因为循环用的$arr是直接指向原数据的,而不是copy了一份。

如果$value是引用,而$arr不是引用,其结果是一样的,同样$value是指向原数据的而不是copy

$arr = array(0,1,2,3,4,5);
foreach($arr as &$value){
    $arr = array();
    echo $value;
}

结果是: 0

还有一种情况比较特殊,即是如果定义了$arr为全局变量的话,$arr也会变成引用

global $arr;
$arr = array(0,1,2,3,4,5);
foreach($arr as $value){
    $arr = array();
    echo $value;
}

 结果是: 0

2. 如果两次循环一个数组,一定不能这样写

foreach($arr as &$value){}
 
foreach($arr as $value){}

这会导致第二次的循环的结果不正确(可能是php的bug吧)。可以用以下几种来代替:

foreach($arr as &$value){}
unset($value);
foreach($arr as $value){}
//solution 2
foreach($arr as &$value){}
foreach($arr as &$value){}
//solution 3
foreach($arr as &$value){}
$arr2 = $arr;
foreach($arr2 as $value){}

3. 防止foreach出现未定义情况,尽量这样来写foreach    

foreach((array)$arr as $value) {}