美文网首页PHP经验分享小细节,一不留神就出错
php在foreach中使用引用赋值&可能遇到的问题

php在foreach中使用引用赋值&可能遇到的问题

作者: 栾呱呱 | 来源:发表于2016-11-15 16:22 被阅读238次

场景

在写项目的时候,由于初涉PHP的赋值引用操作,觉得这个功能非常强大,用时一时爽,没有深入了解过其中的原理,导致了一些当时觉得不可思议的BUG,废话不都说,我举个例子详细的描述一下这个问题。

代码:

$test=array('a','b','c');   
foreach($test as &$value){  
     echo $value;  
}  
echo $value;    
foreach($test as $value){  
     echo $value;  
}  
echo $value; 

结果:

'a','b','c'
'c'
'a','b','b'
'b'

解释:

在第一个foreach中,我们使用了赋值引用符号,它的意思是每次遍历时,$value指向的是$test数组中的对应元素的地址,循环一次时,$value指向的是'a'的地址,第二次循环的时候,$test指向的是第二个元素'b'的地址,第三次�循环时,指向的就是'c'的地址。当我们在做第二次遍历的时候,其实$value变量指向的还是$test的第三个元素即'c'的地址。然后foreach本身的操作是把数组中对应的元素赋值给as后面的变量,所以在第二个foreach中,遍历第一次的时候,把‘a’赋值给$value指向的地址即['a','b','a'],第二次遍历的时候,把'b'赋值给$value指向的地址即['a','b','b'],第三次遍历的时候,就把'b'赋值给$value指向的地址,这也就是为什么输出结果是['a','b','b']而不是['a','b','c']的原因。

解决方案:

在使用完赋值引用操作符之后,把变量unset掉,上例中加上unset($value)语句,相当于取消$value对该地址的引用,这样第二次foreach的时候,$value相当于新的变量,不会导致上述问题。这也是一个很好的编程习惯。

实验:

$test=array('a','b','c');  
foreach($test as &$value){  
     //对$value进行操作  
}  
var_dump($test);

大家如果运行一下的话,会发现浏览器打印出来的结构是这样的:

array (size=3)
  0 => string 'a' (length=1)
  1 => string 'b' (length=1)
  2 => &string 'c' (length=1)

大家有木有发现,元素'c'的前面有个赋值引用符号’&‘,原因就在这里。

相关文章

  • php在foreach中使用引用赋值&可能遇到的问题

    场景 在写项目的时候,由于初涉PHP的赋值引用操作,觉得这个功能非常强大,用时一时爽,没有深入了解过其中的原理,导...

  • PHP foreach与引用赋值问题

    $arr=array('a','b','c');foreach($arras&$v){}foreach($arra...

  • PHP foreach中使用引用(&)

    将以下代码打印 打印出来的结果跟预期结果的不一致,这是因为在第一次的foreach中使用了引用,顺其而然的$val...

  • Python: 链式赋值的坑

    在我们使用Python的过程中, 经常遇到赋值语句, 就像下面的那样: 可能你会觉得我又要说什么变量赋值就是引用,...

  • PHP中foreach引用的坑

    背景 已知一个map如下: 想要做的操作: 修改map中每个value的值 将map中的所有value放入一个数组...

  • 在React开发中遇到的问题——数组引用赋值

    在React开发中遇到了一个问题:需求是在一个选择组件中选择数据mydata数组,确定后将mydata数组返回到父...

  • Drupal 安装 amp 安装问题回顾

    Drupal 安装 amp 安装问题回顾:安装amp可能会遇到的问题及解决办法 本地测试环境 1.必备:cms程...

  • PHP引用变量相关问题

    什么是引用变量? 在PHP中引用意味着用不同的名字访问同一个变量内容定义方式:使用&符号 1、普通变量赋值依据co...

  • PHP引用赋值

    有一点重要事项必须指出,那就是只有有名字的变量才可以引用赋值。 <? $foo =25; $bar=&$foo;/...

  • php 引用遇到的问题

    最近遇到这样的问题 第一个foreach 首先理解&,它指向变量的内存地址,可以理解为C语言中的指针。ok ,先看...

网友评论

    本文标题:php在foreach中使用引用赋值&可能遇到的问题

    本文链接:https://www.haomeiwen.com/subject/glclpttx.html