zoukankan      html  css  js  c++  java
  • php在foreach中使用引用赋值&可能遇到的问题

    代码:

    1.  
      $test=array('a','b','c');
    2.  
       
    3.  
      foreach($test as &$value){
    4.  
      echo $value;
    5.  
      }
    6.  
      echo $value;
    7.  
       
    8.  
      foreach($test as $value){
    9.  
      echo $value;
    10.  
      }
    11.  
      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相当于新的变量,不会导致上述问题。这也是一个很好的编程习惯。

    实验:

    1.  
      $test=array('a','b','c');
    2.  
       
    3.  
      foreach($test as &$value){
    4.  
      //对$value进行操作
    5.  
      }
    6.  
      var_dump($test);

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

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

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

  • 相关阅读:
    麻省理工算法导论学习笔记(1)算法介绍
    麻省理工算法导论学习笔记(2)渐近符号、递归及解法
    Mybatis if 标签 判断不生效
    Linux permission denied解决方法?
    MySQL查找是否存在
    List集合数据去重
    Java获取list集合的前几个元素
    git如何新建(修改)分支
    asp.net下url参数含有中文读取后为乱码
    时间复杂度为O(n)的排序算法
  • 原文地址:https://www.cnblogs.com/cjymuyang/p/9467757.html
Copyright © 2011-2022 走看看