标签:
<?php $arr = array(‘1‘,‘2‘); foreach($arr as &$value){ } foreach($arr as $value){ var_dump($value); }
输出
string(1) "1"
string(1) "1"
这样解释吧,把foreach
展开成赋值的话
foreach($arr as &$value) {
//noop
}
大致是
#begin first foreach
$value = &$arr[0];
//noop
$value = &$arr[1];
//noop
#end foreach
这时候如果打印$arr,你会看到
array(2) {
[0]=>
string(1) "1"
[1]=>
&string(1) "2"
}
也就是说$value
仍然是$arr[1]
的引用(别名)
然后我们再把第二个foreach拆开
#begin second foreach
$value = $arr[0];//note: 由于$value <=> &$arr[1], 此时$arr[1]被赋值成为$arr[0],也就是1
var_dump($value);//1
$value = $arr[1];//相当于$arr[1] = $arr[1]; 没有实际效果
var_dump($value);//1
#end foreach
解决方案是永远不要用&
或者老老实实按照官网的指示,用unset解除引用
<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
$value = $value * 2;
}
// $arr is now array(2, 4, 6, 8)
unset($value); // break the reference with the last element
?>
标签:
原文地址:http://www.cnblogs.com/zixueit/p/4871246.html