1. $value为传值赋值,而不是引用赋值。如需引用赋值,需要添加&符号。如下例所示:
/////Example 1:
$array=array(1,2,3);
foreach($array as $key => $value){
$value *= 2;
}
print_r($array);
Result:
Array ( [0] => 1 [1] => 2 [2] => 3 )
/////Example 2:
$array=array(1,2,3);
foreach($array as $key => $value){
$array[$key] *= 2;
}
print_r($array);
Result:
Array ( [0] => 2 [1] => 4 [2] => 6 )
原因:因为foreach()方法中的对$key和$value的赋值为传值赋值,所以Example 1中直接赋值给$value并没有真正地改变$array中的值;Example 2中$array[$key]是引用赋值,直接对$array中的数据进行操作,比较容易理解。
如果想要用$value完成对$array的更改,可以用&$value将赋值方式改为引用赋值,这时变量$value的指针就直接指向数组中的单元了。如下:
$array=array(1,2,3);
foreach($array as $key => &$value){
$value *= 2;
}
print_r($array);
Result:
Array ( [0] => 2 [1] => 4 [2] => 6 )
2. foreach循环中的$value变量,在外部也可以直接访问,所以foreach之后最好用unset来销毁变量。示例如下:
/////Example 3:
$array=array(1,2,3);
foreach($array as $key => $value){
$value *= 2;
}
print_r($array);
echo '
', $value;
Result:
Array ( [0] => 1 [1] => 2 [2] => 3 )
6
3. 了解foreach背后的机制,在对Array中的每个元素进行循环时,指针会依次将key和value赋值给$key和$value,如果不销毁,对$value的后续访问将很有可能引发错误。示例如下:
/////Example 4:
$array=array(1,2,3);
foreach($array as $key => &$value){
echo $value;
}
echo $value;
foreach($array as $key => $value){
echo $value;
}
echo $value;
Result:
1,2,3
3
1,2,2
2
在第一次引用赋值的foreach循环后,$value指向了数组的最后一个元素“3”,之后对其echo时,仍然指向“3”。
在第二次传值赋值的foreach循环中,
第一次将index=0的“1”赋值给index=2,此时数组为“1”,“2”,“1”;
第二次将index=1的“2”赋值给index=2,此时数组为“1”,“2”,“2”;此时index=2的元素的值为2;
第三次将index=2的“2”赋值给index=2,此时数组仍为“1”,“2”,“2”。
4. foreach的其它用法:展开嵌套数组。(http://php.net/manual/en/control-structures.foreach.php)
Result:
A: 1; B: 2
A: 3; B: 4
Result:
1
3
Result:
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: