<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<head><meta forua="true" http-equiv="Cache-Control" content="max-age=0" /></head>
<card title="PHP的foreach中解决：使用引用时的错误-Bug #29992 foreach by reference corrupts the array" id="card1">
<p> 游客</p><p>
标题:PHP的foreach中解决：使用引用时的错误-Bug #29992 foreach by reference corrupts the array<br/>
正文:<br/>
一、问题先看一个例子：&amp;lt;?php$ar = array(1, 2, 3);var_dump($ar);foreach ($ar as &amp;amp;$v) {}foreach ($ar as $v) {}var_dump($ar);?&amp;gt;输出为：array(3) {  [0]=&amp;gt;  int(1)  [1]=&amp;gt;  int(2)  [2]=&amp;gt;  int(3)}array(3) {  [0]=&amp;gt;  int(1)  [1]=&amp;gt;  int(2)  [2]=&amp;gt;  &amp;amp;int(2)}？？？为什么没有进行赋值操作，数组最后一个元素的值却发生了改变呢？我早就发现了这个问题，一开始以为是 PHP 的 bug，就扔着没管它， foreach 中不使用引用就没事， 用 foreach $k =&amp;gt; $v 然后 $ar[$k] 来改变原始数组， 略微损失点效率。二、分析今天花了点时间，看了 参考 中的文章， 算是稍微明白一点了，原来是这个样子的：在执行第一个使用引用的 foreach 时， 一开始， $v 指向 $ar[0] 的存储空间，空间内存储着 1 ， foreach 结束时， $v 指向 $ar[2] 的存储空间，空间内存储着 3 。 下面要开始执行第二个 foreach 了，注意和第一个 foreach 不同， 第二个 foreach 没有使用引用，那么就是赋值方式， 即将 $ar 的值依次 赋值 给 $v 。 进行到第一个元素时，要将 $ar[0] 赋值给 $v 。 问题就在这里，由于刚刚执行完第一个 foreach， $v 不是一个新变量，而是已经存在的、指向 $ar[2] 的那个 引用 ， 如此一来，对 $v 进行赋值的时候，就将 $ar[0] = 1 写入了 $ar[2] 的实际存储空间， 相当于对 $ar[2] 进行赋值。 依此类推，第二个 foreach 执行的结果， 就是数组的最后一个元素变成了倒数第二个元素的值。 参考文章 2 中有详细的示意图。如果说这是一个错误，那么错误的原因就在于对引用变量的使用。 当引用变量指向和其他变量时，改变引用变量的值当然会影响到他指向的其他变量。 单独说谁都明白，但<br/><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=1770&amp;Page=1">[&lt;&lt;]</a><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=1770&amp;Page=1">[[1]]</a><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=1770&amp;Page=2">[2]</a><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=1770&amp;Page=2">[&gt;&gt;]</a><br/>
<br/>
<a href="wap.asp?act=Com&amp;id=1770">查看评论(0)</a><br/>
<a href="wap.asp?act=AddCom&amp;inpId=1770">发表评论</a><br/><br/>

<br/>

<br/>
<a href="http://camnpr.com/wap.asp">首页</a>
</p>
</card>
</wml>