2017-01-30 25 views
0

我来自PHP的PHP,我不明白为什么,要获得,转换并返回一个数组在PHP中,你必须使用“&”又名“参考”符号在foreach()...PHP函数返回数组:为什么我必须通过引用?

 $some_array = array(1, 2, 3); 



     function test($a) { 
      foreach ($a as $k => &$v) { 
       $v = 'Hello!'; 
      }; 
      return $a; 
     }; 

     $result = test($some_array); 


     var_dump($result); // array('Hello!', 'Hello!', 'Hello!'); 

但随着:

function test($a) { 
      foreach ($a as $k => $v) { 
       $v = 'Hello!'; 
      }; 
      return $a; 
     }; 

[...]

var_dump($result); // array(1, 2, 3) 
+0

另一种可能更容易用于复杂数组的方法是使用新值设置原始参数数组。你有当前元素的关键。在“foreach”中这样做是安全的。请参阅:https://eval.in/726978。即它没有提及相同的结果。你需要知道元素键。只是获得相同效果的另一种方式。 –

+0

谢谢@ ryan-vincent,非常明确的答案! – AmintaCode

回答

3

要了解什么是 “按值传递” 和 “按引用传递” 是,你守ld read the docs

默认情况下,函数参数是通过值传递的(所以如果函数中参数的值被改变,它不会在函数之外被改变)。要允许函数修改它的参数,它们必须通过引用传递。

要使函数的参数始终按引用传递,请在函数定义中的参数名称前加一个&符(&)。

foreach该文档构造also states

为了能够直接修改环路内的数组元素与&$value。在这种情况下,该值将通过引用进行分配。

您可以选择按引用传递并直接改变数值(&$v),也可以选择按值传递,但在这种情况下,你必须使用元素键更改$k数组值:

foreach ($a as $k => $v) 
{ 
    $a[$k] = 'Hello!'; 
}; 
+0

其实在这种情况下它与函数参数无关。这纯粹是与使用(或不使用)的foreach – RiggsFolly

+0

@RiggsFolly大坝权利,我固定了我的答案了一下,thanx –

+0

我真的不明白你的最后一句话,我不知道你在说什么 – RiggsFolly

2

如果您只是将数组传递给foreach而不使用引用&,则表示您将数组的副本传递给foreach。

当您随后对阵列(副本)进行更改时,将对副本进行更改。当foreach结束后,当然副本就会被抛弃。

因此,当您在foreach完成后返回$a时,实际上是将传递给该函数的副本作为参数返回,而该参数未更改。

即使您要将该数组作为参考传递给该函数,它也不会有任何区别,因为它是制作一次性副本或使用原始数组的依赖于使用&引用的foreach指令在实际的foreach代码行中。

相关问题