Foreach での PHP 参照渡し
PHP では、変数は通常の変数または参照変数のいずれかになります。変数の参照を別の変数に割り当てると、後者は参照変数となり、基本的に元の変数と同じメモリ位置にバインドされます。この動作は、参照渡し構文 (&) で foreach ループを使用する場合に影響します。
次のコードを考えてみましょう。
$a = ['zero', 'one', 'two', 'three']; foreach ($a as &$v) { } foreach ($a as $v) { echo $v . PHP_EOL; }
このコードの出力は次のとおりです。
zero one two two
なぜこれが起こるのですか?
最初の foreach ループでは、$a の各要素は次のようになります。変数 $v への参照として割り当てられます。これは、$v を変更すると、$a 内の対応する要素も変更されることを意味します。
具体的には、最初のループの最後の反復中に、$v には $a[3] の値が割り当てられます (つまり、'三つ')。ただし、この割り当てにより参照関係が作成されるため、$a[3] は参照変数になります (& を使用して明示的に割り当てられていない場合でも)。
2 番目の foreach ループでは、$ 内の要素の値がが印刷されます。ただし、$a[3] は参照変数になっているため、その値は $v の値とともに変化します。 3 回目の反復中に $v に値 'two' が割り当てられると、$a[3] も 'two' になります。
その結果、最後の反復では $v (これはまだ $a を指します) [3]) の値は 'two' であり、'two' が出力されます。これは、直感的に予想される「three」を出力するのではなく、最後の反復で「two」が繰り返される理由を説明しています。
以上がPHP の参照渡し (&) を使用した foreach が配列要素を予期せず変更するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。