php foreach遍历数组用法介绍
语法
foreach ( array_expression as $key => $value ) statement
实例1:
<table width="620" align="center" border="0" cellpadding="1" cellspacing="1" style="background:#FB7"> <tr> <td width="464" height="27" bgcolor="#FFE7CE"> 代码如下</td> <td width="109" align="center" bgcolor="#FFE7CE" style="cursor:pointer;" onclick="doCopy('copy4952')">复制代码</td> </tr> <tr> <td height="auto" colspan="2" valign="top" bgcolor="#FFFFFF" style="padding:10px;" class="copyclass" id=copy4952><?php
$color=array('white' => '白色' ,
'black' => '黑色' ,
'red' => '红色' ,
'green' => '绿色',
'yellow' => '黄色');
foreach( $color as $c) echo $c ."<br>";
?>
通过foreach不仅可以获得元素的值也可以获得键名,结构形式:
<table width="620" align="center" border="0" cellpadding="1" cellspacing="1" style="background:#FB7"> <tr> <td width="464" height="27" bgcolor="#FFE7CE"> 代码如下</td> <td width="109" align="center" bgcolor="#FFE7CE" style="cursor:pointer;" onclick="doCopy('copy7464')">复制代码</td> </tr> <tr> <td height="auto" colspan="2" valign="top" bgcolor="#FFFFFF" style="padding:10px;" class="copyclass" id=copy7464>
foreach( $color as $c) echo $c ."<br>";
或
foreach( $color as $key => $c) echo $key.$c ."<br>";
这里跟第一种方法的区别就是多了个$key,也就是除了把当前元素的值赋给$value外,当前元素的键值也会在每次循环中被赋给变量$key。键值可以 是下标值,也可以是字符串。比如book[0]=1中的"0",book[id]="001"中的"id".
下面来仔细探讨下foreach使用中的一些问题。
普通情况下,foreach($arr as $value)中的$arr和$value是拷贝,不受外部影响的,即
<table width="620" align="center" border="0" cellpadding="1" cellspacing="1" style="background:#FB7"> <tr> <td width="464" height="27" bgcolor="#FFE7CE"> 代码如下</td> <td width="109" align="center" bgcolor="#FFE7CE" style="cursor:pointer;" onclick="doCopy('copy2043')">复制代码</td> </tr> <tr> <td height="auto" colspan="2" valign="top" bgcolor="#FFFFFF" style="padding:10px;" class="copyclass" id=copy2043>$arr = array(0,1,2,3,4,5);
foreach($arr as $value){
$arr = array();
echo $value;
}
// 12345
但如果$arr是引用的话,情况则不同了,我们用代码来说明问题
<table width="620" align="center" border="0" cellpadding="1" cellspacing="1" style="background:#FB7"> <tr> <td width="464" height="27" bgcolor="#FFE7CE"> 代码如下</td> <td width="109" align="center" bgcolor="#FFE7CE" style="cursor:pointer;" onclick="doCopy('copy2820')">复制代码</td> </tr> <tr> <td height="auto" colspan="2" valign="top" bgcolor="#FFFFFF" style="padding:10px;" class="copyclass" id=copy2820>$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。
<table width="620" align="center" border="0" cellpadding="1" cellspacing="1" style="background:#FB7"> <tr> <td width="464" height="27" bgcolor="#FFE7CE"> 代码如下</td> <td width="109" align="center" bgcolor="#FFE7CE" style="cursor:pointer;" onclick="doCopy('copy1745')">复制代码</td> </tr> <tr> <td height="auto" colspan="2" valign="top" bgcolor="#FFFFFF" style="padding:10px;" class="copyclass" id=copy1745>
$arr = array(0,1,2,3,4,5);
foreach($arr as &$value){
$arr = array();
echo $value;
}
// 结果是: 0
还有一种情况比较特殊,即是如果定义了$arr为全局变量的话,$arr也会变成引用:
<table width="620" align="center" border="0" cellpadding="1" cellspacing="1" style="background:#FB7"> <tr> <td width="464" height="27" bgcolor="#FFE7CE"> 代码如下</td> <td width="109" align="center" bgcolor="#FFE7CE" style="cursor:pointer;" onclick="doCopy('copy9909')">复制代码</td> </tr> <tr> <td height="auto" colspan="2" valign="top" bgcolor="#FFFFFF" style="padding:10px;" class="copyclass" id=copy9909>global $arr;
$arr = array(0,1,2,3,4,5);
foreach($arr as $value){
$arr = array();
echo $value;
}
// 结果是: 0
如果两次循环一个数组,一定不能这样写
<table width="620" align="center" border="0" cellpadding="1" cellspacing="1" style="background:#FB7"> <tr> <td width="464" height="27" bgcolor="#FFE7CE"> 代码如下</td> <td width="109" align="center" bgcolor="#FFE7CE" style="cursor:pointer;" onclick="doCopy('copy4880')">复制代码</td> </tr> <tr> <td height="auto" colspan="2" valign="top" bgcolor="#FFFFFF" style="padding:10px;" class="copyclass" id=copy4880>foreach($arr as &$value){}
foreach($arr as $value){}
这会导致第二次的循环的结果不正确(可能是php的bug吧)。可以用以下几种来代替
<table width="620" align="center" border="0" cellpadding="1" cellspacing="1" style="background:#FB7"> <tr> <td width="464" height="27" bgcolor="#FFE7CE"> 代码如下</td> <td width="109" align="center" bgcolor="#FFE7CE" style="cursor:pointer;" onclick="doCopy('copy4325')">复制代码</td> </tr> <tr> <td height="auto" colspan="2" valign="top" bgcolor="#FFFFFF" style="padding:10px;" class="copyclass" id=copy4325>//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
<table width="620" align="center" border="0" cellpadding="1" cellspacing="1" style="background:#FB7"> <tr> <td width="464" height="27" bgcolor="#FFE7CE"> 代码如下</td> <td width="109" align="center" bgcolor="#FFE7CE" style="cursor:pointer;" onclick="doCopy('copy2230')">复制代码</td> </tr> <tr> <td height="auto" colspan="2" valign="top" bgcolor="#FFFFFF" style="padding:10px;" class="copyclass" id=copy2230>foreach((array)$arr as $value) {}
您可能感兴趣的文章:
php遍历数组之list foreach each用法总结
php数组遍历foreach ($arr as &$value)用法介绍
php遍历数组的几种方法(for foreach list each while)
php数组遍历(foreach,list,each)实例演练
php遍历数组list foreach each方法实例
php一维数组遍历方法的比较分析
php遍历循环数组实现方法
php数组入门教程之数组遍历
php遍历二维数组的几种方法
php遍历数组 foreach each() list()方法总结