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 '<br />', $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)

<?php
$array = [
    [1, 2],
    [3, 4],
];

foreach ($array as list($a, $b)) {
    // $a contains the first element of the nested array,
    // and $b contains the second element.
    echo "A: $a; B: $b\n";
}
?>
Result:
A: 1; B: 2
A: 3; B: 4
<?php
$array = [
    [1, 2],
    [3, 4],
];

foreach ($array as list($a)) {
    // Note that there is no $b here.
    echo "$a\n";
}
?>
Result:
1
3
<?php
$array = [
    [1, 2],
    [3, 4],
];

foreach ($array as list($a, $b, $c)) {
    echo "A: $a; B: $b; C: $c\n";
}
?>
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: 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值