zoukankan      html  css  js  c++  java
  • php foreach 使用&(与运算符)引用赋值要注意的问题

    首先了解一下“引用赋值”,看一个例子:

    <?php           <?php   
    $a=123;         $a=123;   
    $b=$a;          $b=&$a;   
    $a=321;         $a=321;   
    echo"$a,$b";    echo"$a,$b";  
    ?>              ?>  
      
    结果:321 123  结果:321 321

    引用赋值:这意味着新的变量简单的引用(换言之,“成为其别名” 或者 “指向”)了原始变量。改动新的变量将影响到原始变量,反之亦然。

    下面看一下要注意的问题,用下面的例子说明:

    <?php
    $arr = array('a', 'b', 'c');
    $arr2 = array('d', 'e', 'f');
    
    foreach($arr as &$value){
        $value .= '4';
    }
    
    foreach($arr2 as $value){
    }
    //print_r($arr);exit;
    
    foreach($arr as $value){
        echo $value, "
    ";
    }
    ?>
    结果为:
    a4 
    b4 
    b4 
    

      

    结果和我期待的不一样,这个就是引用引起的问题。

    在 foreach($arr as &$value) 数组遍历到最后,引用关系并没有断开,这是等同于 $value 是 $arr 的最后一个单元即 $arr[2]  的引用。

    再到 foreach($arr2 as $value),$value的值一直随数组单元的值变,由于引用关系没有断开,$arr[2] 的值也跟着变化。一直到$arr2遍历完,这时$value的值为f,所以$arr[2]值也为f。

    这时$arr的值应为:

    Array
    (
        [0] => a4
        [1] => b4
        [2] => f
    )

    再到 foreach($arr as $value),由于$value 是 $arr[2] 的引用,同理,这时 $arr[2] 的值也随着 $value 变化。

    1、遍历到key为0时,a4 给 $value,此时$arr[2]值为a4

    2、遍历到key为1时,b4 给 $value,此时$arr[2]值为b4

    3、遍历到key为2时,这时注意,不是f给$value了,因为此时的$arr[2]的值不是f,而是b4了。

     也就是为什么我们所看到的输出结果。

    所以在 foreach 使用引用时要注意了。也可以在处理完后立即断开引用关系,后面就不会有上述情况了。

    foreach($arr as $value){
        $value .= '4';
    }
    unset($value);

     <转载>

  • 相关阅读:
    UVa 1151 Buy or Build【最小生成树】
    UVa 216 Getting in Line【枚举排列】
    UVa 729 The Hamming Distance Problem【枚举排列】
    HDU 5214 Movie【贪心】
    HDU 5223 GCD
    POJ 1144 Network【割顶】
    UVa 11025 The broken pedometer【枚举子集】
    HDU 2515 Yanghee 的算术【找规律】
    Java基本语法
    Java环境变量,jdk和jre的区别,面向对象语言编程
  • 原文地址:https://www.cnblogs.com/Stone--world/p/3626994.html
Copyright © 2011-2022 走看看