zoukankan      html  css  js  c++  java
  • foreach() 中用指针指向数组元素,循环结束后最好销毁指针

    之前发过一次微博,今天又遇到这个问题,并且再次犯错,于是决定再加深一下。

    就举php.net里的一个例子吧

    $a = array('abe','ben','cam');
    foreach ($a as $k=>&$n){
        $n = strtoupper($n);
    }
    print_r($a);
    foreach ($a as $k=>$n){ // notice NO reference here!
        echo "$n
    ";
    }
    print_r($a);

    输出的结果是:

    Array
    (
        [0] => ABE
        [1] => BEN
        [2] => CAM
    )
    ABE
    BEN
    BEN
    Array
    (
        [0] => ABE
        [1] => BEN
        [2] => BEN
    )
    
    

    可以看到第一次foreach()循环以后是正常的,第二次循环以后$a[2]从变成了'BEN',和$a[1]一样。

    初看很纳闷,但是如果在第二个foreach()里print_r($a),就很容易明白了,结果如下:

    Array
    (
        [0] => ABE
        [1] => BEN
        [2] => ABE
    )
    
    Array
    (
        [0] => ABE
        [1] => BEN
        [2] => BEN
    )
    
    Array
    (
        [0] => ABE
        [1] => BEN
        [2] => BEN
    )

    由于第一个foreach()是用指针指向数组元素,所以循环结束后变量$n依然指向数组$a的最后一个元素,也就是$a[2]。

    第二个foreach()里,第一次循环就将$a[0]的值'ABE'赋给$n,第二次又将$a[1]的值'BEN'赋给$n,其实这两次修改的都是$a[2]这个元素,第三次等于没有变化,所以$a[2]无辜地被修改了三次,导致最后的结果。

    由此可见,如果foreach()中用指针指向数组元素,循环结束后最好销毁指针,以免后面再次用到重名的变量导致数组的值被无辜修改。

     

    PS:之前的微博如下:

     

  • 相关阅读:
    TDSSNIClient initialization failed with error 0x7e, status code 0x60.
    SourceSafe Outof Memory
    机器学习(Part I)机器学习的种类
    机器学习PartIII:测试算法和NFL定理
    Google架构学习
    MediaWiki安装问题总结
    [转]IT项目管理实务
    几本关于统计学习的书
    Googlebot开始检索网站深层内容
    中文搜索引擎技术之网页排序
  • 原文地址:https://www.cnblogs.com/roving/p/3468110.html
Copyright © 2011-2022 走看看