对于&引用赋值大家应该都比较了解,但是当&和foreach一起使用的时候就会出现很有意思的结果。废话不多说,上代码:
//foreach 使用&引用赋值
$arr = array('a', 'b', 'c');
$arr2 = array('d', 'e', 'f');
foreach($arr as &$value){
$value = '&' . $value;
}
print_r($arr);
//输出结果
Array
(
[0] => &a
[1] => &b
[2] => &c
)
到目前为止一切都还正常,接下来我们遍历一下这个数组
//foreach 使用&引用赋值
$arr = array('a', 'b', 'c');
$arr2 = array('d', 'e', 'f');
foreach($arr as &$value){
$value = '&' . $value;
}
print_r($arr);
foreach($arr as $value){}
print_r($arr);
//两个print_r输出结果:
Array
(
[0] => &a
[1] => &b
[2] => &c
)
Array
(
[0] => &a
[1] => &b
[2] => &b
)
可以看见遍历之后结果变成了[&a, &b, &b],为什么呢?
首先在我们第一次&遍历的时候,$value是指向的最后一层遍历
$arr[2]的指针地址
在我们进行第二次普通遍历的时候,
$key == 0; $value == &a; $arr[2] = &a;
$key == 1; $value == &b; $arr[2] = &b;
$key == 2; $value == &b; $arr[2] = &b;
最开始的时候我进入了一个误区,就是
当key等于2 的时候,&c不是会重新赋值给$arr[2]吗,为什么会是&b;
这里我解释一下,因为
在key等于1的时候, $arr[2]的值已经是&b了,
也就是在最后一层遍历的时候数组就已经是 [&a, &b, &b]了,所以最后一层遍历的时候根本不会 出现&c。
//foreach 使用&引用赋值
$arr = array('a', 'b', 'c');
$arr2 = array('d', 'e', 'f');
foreach($arr as &$value){
$value = '&' . $value;
}
foreach($arr as $value){
print_r($arr);
echo "\n";
}
//key==0
Array
(
[0] => &a
[1] => &b
[2] => &a
)
//key==1
Array
(
[0] => &a
[1] => &b
[2] => &b
)
//key==2
Array
(
[0] => &a
[1] => &b
[2] => &b
)
最后补充一下,在平时使用&的时候避免出现问题,适当考虑使用unset进行销毁。