Home >php教程 >php手册 >php foreach遍历数组用法介绍

php foreach遍历数组用法介绍

WBOY
WBOYOriginal
2016-06-13 10:16:51999browse

在php中遍历数组有很多方法,foreach、each、list、for等等遍历数组语句,但是在这几种中foreach遍历数组性能最好,所以我也常用,下面我来介绍入门者foreach遍历数组实例。


语法

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

实例1:

 代码如下 复制代码

 $color=array('white' => '白色' ,
       'black' => '黑色' ,
       'red' => '红色' ,
       'green' => '绿色',
       'yellow' => '黄色');
 foreach( $color as $c) echo $c ."
";   
?>

通过foreach不仅可以获得元素的值也可以获得键名,结构形式:

 代码如下 复制代码

 

foreach( $color as $c) echo $c ."
";

foreach( $color as $key => $c) echo $key.$c ."
";


这里跟第一种方法的区别就是多了个$key,也就是除了把当前元素的值赋给$value外,当前元素的键值也会在每次循环中被赋给变量$key。键值可以 是下标值,也可以是字符串。比如book[0]=1中的"0",book[id]="001"中的"id".

下面来仔细探讨下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

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

 代码如下 复制代码

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

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

 代码如下 复制代码

//solution 1
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){}

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

 代码如下 复制代码

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

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn