|  |      1GordianZ      2013-09-07 21:58:54 +08:00  1 http://php.net/manual/en/control-structures.foreach.php Warning Reference of a $value and the last array element remain even after the foreach loop. It is recommended to destroy it by unset(). | 
|  |      3bixuehujin      2013-09-07 23:27:32 +08:00 第一个foreach结束后$v还可以访问,而且是$ww[2]的引用,第二个foreach每循环一次$ww[2]就被重写一次。 所以最后$ww[2]值为3 | 
|  |      4mengzc      2013-09-07 23:57:21 +08:00 现在知道了~~foreach ($qq as $v) {} 这个运行完以后吧$v的值变了,所以 $ww[2]会变成3。 如果你把两个foreach,更换顺序,结果就不一样咯,但是实际上还是把值变了,只是两个值一样。 | 
|  |      5mengzc      2013-09-08 00:06:24 +08:00 @bixuehujin 为什么改变$v的值会把$ww[2]的值改变呢? | 
|  |      6osinx      2013-09-08 00:28:02 +08:00 两行foreach之间加再加一句  unset($v); 再看看执行的结果。 | 
|  |      7msg7086      2013-09-08 00:55:47 +08:00 @mengzc 因为$v引用了$ww数组的最后一个元素。 楼主文中的 》foreach ($ww as &$v) {} 与 》$v = &$ww[2]; 等效。 而后的 》foreach ($qq as $v) {} 与 》$v = $qq[2]; 以及 》$ww[2] = $qq[2]; 等效。 不知能不能明白? | 
|  |      8anewg      2013-09-08 09:28:01 +08:00 1楼早已给出答案,楼主要是懒得看英文,手册里有选项“view this page in”直接选中文就好了。 “数组最后一个元素的 $value 引用在 foreach 循环之后仍会保留。建议使用 unset() 来将其销毁。” 你要是foreach中用了&,则 foreach ($ww as &$v){} 中的$v(第一个foreach结束后$v引用在$ww的最后一个元素,也就是$ww[2]上) 在之后的foreach中仍然是可以访问到$v($ww[2])的。而且不仅仅是foreach,只要你在之后的脚本中对$v赋值,都是会间接改变你的$ww[2](效果跟$v = &$ww[2]是一样的) 所以你foreach里要是使用了引用,foreach结束后用unset($v);清除对 $ww[2] 的引用,消除后续语句对$ww[2]的影响.(楼主也可以改变你的第二个foreach为foreach ($qq as $q){},这样就没有使用到$v了) | 
|      9lvni      2013-09-08 11:03:28 +08:00 第一个循环结束之后 foreach ($ww as &$v) {} $v是指向$ww 最后一个值的引用 此时如果对 $v 赋值都会改变 $ww 最后一个元素的值 例如 :$v = 'someValue'; 则: $ww = Array ( [0] => 123, [1] => 456, [2] => 'someValue' ) 第二个循环遍历逐个将 $qq 的元素赋值给 $v; 循环结束时刚好是 $v = $qq[2] = 3 | 
|  |      10lizheming      2013-09-08 12:15:09 +08:00 | 
|  |      11bombless      2013-09-08 13:25:50 +08:00 引用的问题。一个很常见的坑。 前一个foreach的最后一个循环使得$v指向$ww[2],后一个foreach的每一次循环把$qq中的值赋给这里的$ww[2]了 | 
|  |      12picasso250      2013-09-13 11:12:58 +08:00 楼主试试以下几种情况,及其区别。 1. 原来的这种 foreach ($ww as &$v) {} foreach ($qq as $v) {} 2. 只需要改个名字,bug就没有了 foreach ($ww as &$vv) {} foreach ($qq as $v) {} 3. 换个顺序也可以哦 foreach ($qq as $v) {} foreach ($ww as &$v) {} 4. 其实去掉引用符号就可以了 foreach ($ww as $v) {} foreach ($qq as $v) {} 5. 当然,官方一点的做法是 foreach ($ww as &$v) {} unset($v) foreach ($qq as $v) {} 请对照这些,实验,并且思考。直到自己领悟。 (实话说吧,楼主的当务之急是学英语,学好了英语,这些问题的答案都在php官方手册上摆着呢) | 
|  |      13ovear OP @picasso250 =。=英文我倒是没问题,但是搜索引擎用的是中文。英文搜索的关键词完全不会。 官方文档是个好东西,之前还没搜到。。 |