foreach()注意事项

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: 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(foreach()注意事项)