【问题标题】:What is & in the php foreach statement? [duplicate]php foreach 语句中的 & 是什么? [复制]
【发布时间】:2013-05-09 18:50:10
【问题描述】:

为了能够直接修改循环内的数组元素,在$value 前加上&。在这种情况下,该值将通过引用从http://php.net/manual/en/control-structures.foreach.php 分配。

 $arr = array(1, 2, 3, 4); 
 foreach ($arr as &$value) {
    echo $value; 
 }

 $arr = array(1, 2, 3, 4);
 foreach ($arr as $value) {
   echo $value;
 }

在这两种情况下,它都会输出 1234。将 & 添加到 $value 实际上是做什么的? 任何帮助表示赞赏。谢谢!

【问题讨论】:

标签: php arrays foreach


【解决方案1】:

它表示您通过引用传递 $value。如果您在 foreach 循环中更改 $value,您的数组将相应修改。

没有它,它将按值传递,并且您对 $value 所做的任何修改都将仅适用于 foreach 循环。

【讨论】:

    【解决方案2】:

    在开始学习什么是通过引用传递时,它并不明显......

    这里有一个例子,希望你能更清楚地理解值传递和引用传递的区别是什么......

    <?php
    $money = array(1, 2, 3, 4);  //Example array
    moneyMaker($money); //Execute function MoneyMaker and pass $money-array as REFERENCE
    //Array $money is now 2,3,4,5 (BECAUSE $money is passed by reference).
    
    eatMyMoney($money); //Execute function eatMyMoney and pass $money-array as a VALUE
    //Array $money is NOT AFFECTED (BECAUSE $money is just SENT to the function eatMyMoeny and nothing is returned).
    //So array $money is still 2,3,4,5
    
    echo print_r($money,true); //Array ( [0] => 2 [1] => 3 [2] => 4 [3] => 5 ) 
    
    //$item passed by VALUE
    foreach($money as $item) {
        $item = 4;  //would just set the value 4 to the VARIABLE $item
    }
    echo print_r($money,true); //Array ( [0] => 2 [1] => 3 [2] => 4 [3] => 5 ) 
    
    //$item passed by REFERENCE
    foreach($money as &$item) {
        $item = 4;  //Would give $item (current element in array)value 4 (because item is passed by reference in the foreach-loop)
    }
    
    echo print_r($money,true); //Array ( [0] => 4 [1] => 4 [2] => 4 [3] => 4 ) 
    
    function moneyMaker(&$money) {       
    //$money-array is passed to this function as a reference.
    //Any changes to $money-array is affected even outside of this function
      foreach ($money as $key=>$item) {
        $money[$key]++; //Add each array element in money array with 1
      }
    }
    
    function eatMyMoney($money) { //NOT passed by reference. ONLY the values of the array is SENT to this function
      foreach ($money as $key=>$item) {
        $money[$key]--; //Delete 1 from each element in array $money
      }
      //The $money-array INSIDE of this function returns 1,2,3,4
      //Function isn't returing ANYTHING
    }
    ?>
    

    【讨论】:

      【解决方案3】:

      这是对变量的引用,在 foreach 循环中的主要用途是您可以更改 $value 变量,这样数组本身也会更改。

      【讨论】:

        【解决方案4】:

        当您只是引用值时,您不会注意到您发布的案例有太大差异。我能想出的最简单的例子来描述通过 value 引用变量与通过 reference 引用变量的区别是这样的:

        $a = 1;
        $b = &$a;
        $b++;
        print $a;  // 2
        

        您会注意到 $a 现在是 2 - 因为 $b 是指向 $a 的 指针。如果你没有在 & 号前加上前缀,$a 仍然是 1:

        $a = 1;
        $b = $a;
        $b++;
        print $a;  // 1
        

        HTH

        【讨论】:

        • 感谢您提供的清晰示例! :)
        【解决方案5】:

        通常每个函数都会创建其参数的副本,使用它们,如果您不返回它们“删除它们”(何时发生这种情况取决于语言)。

        如果以&amp;VARIABLE 作为参数运行函数,这意味着您通过引用添加了该变量,实际上该函数即使不返回它也可以更改该变量。

        【讨论】:

          猜你喜欢
          • 2011-09-27
          • 1970-01-01
          • 1970-01-01
          • 2012-08-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-15
          • 2017-09-27
          相关资源
          最近更新 更多