eg:

$arr = array(1,2,3,4);
foreach($arr as $key => &$value){

}
foreach($arr as $key => $value){

}

result:

[1,2,3,3]

解释:

1. foreach不是块级域,数组引用结束,$key , $value  并没有释放内存

2. 当第一次引用循环结束的时候,$value指向数组最后一个元素4

3. 当第二次开始循环 (此时$value 已经是指向最后一个元素,是引用)

循环4次  数组的变化分别是:

1   ->    [1,2,3,4]

2   ->    [1,2,3,4]

3   ->    [1,2,3,3]
第三次value指向最后一个元素3 但是value是全局引用在上次循环指向了最后一个元素 所以value=3的时候 也会把最后一个元素的值改为3
4   ->    [1,2,3,3]

注意事项:

1. foreach 实现原理有个内部指针的概念

2. &的foreach循环结束   指针会指向最后一个元素

如何避免:
在用&foreach循环后 unset ($value)

2019-08-01: 今天看到很多人在关注这个问题,关于鸟哥解释的php源码分析的foreach,大家感兴趣的可以去看看:http://www.laruence.com/2008/11/20/630.html