2017-01-30 13 views
0

私はJavascriptからPhpに来ていますが、なぜ変換してPHPで配列を返すのか理解できません。foreach()で "&"別名 "参照"記号を使用する必要があります。 "値渡し" を理解し、 "参照渡し" に配列を返すPHP関数:なぜ参照渡しが必要ですか?

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

ありがとう@ライアンヴィンセント、非常に明確な答え! – AmintaCode

答えて

3

されている、あなた寿:

 $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!'); 

しかし、とldはthe docsをお読みください。デフォルトでは

(関数内の引数の値が変更された場合、それは関数の外部で変更されないように)、関数の引数は値によって渡されます。関数が引数を変更できるようにするには、関数を参照渡しする必要があります。

関数の引数を常に参照渡しにするには、関数定義の引数名の前にアンパサンド(&)を付加します。

foreach構築also states上のドキュメント:

直接&$valueに先行するループ内の配列要素を変更できるようにするために。その場合、値は参照によって割り当てられます。

あなたは参照渡しすることを選択すると、直接(&$v)の値を変更するか、値渡しすることもできますが、この場合には、あなたは$kの要素のキーを使用して、配列の値を変更する必要があります。

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

実際には、この場合の関数引数とは関係ありません。 – RiggsFolly

+0

@RiggsFolly dam right、私はちょっと答えを固定しました –

+0

あなたの最後の文もどちらか分かりませんが、あなたが何を言っているのかは分かりません – RiggsFolly

2

&という参照を使わずにforeachに配列を渡すだけでは、配列のコピーがforeachに渡されます。

アレイ(コピー)を変更すると、そのコピーが変更されます。 foreachが終了すると、コースのコピーが破棄されます。

foreachが完了した後に$aを返すと、関数に渡されたコピーがパラメータとして返されますが、これは変更されません。

&リファレンスの使用方法に応じて、配列を渡す場合でも、関数には、使い捨てコピーを作成する、または元の配列を使用するforeachはありません命令は実際のforeachコード行にあります。

関連する問題