参照を使用した Foreach ループの予期しない動作
参照を使用して PHP の foreach ループを使用すると、次のコード スニペットに示すように、奇妙な動作が発生する可能性があります。 :
$a = array('a', 'b', 'c', 'd'); foreach ($a as &$v) { } foreach ($a as $v) { } print_r($a);
このコードは配列を反復処理することを目的としています$a は、最初のループで参照変数 $v を使用し、2 番目のループで非参照変数 $v を使用します。しかし、驚くべきことに、出力では配列の最後の要素 'd' が上書きされたことが示されています。
Array ( [0] => a [1] => b [2] => c [3] => c )
動作の説明
これは予期せぬものですこの動作については、PHP のドキュメントに詳しく記載されています。 foreach ループで参照を使用する場合、ループが終了した後も配列の最後の要素の参照が残ることを警告します。この問題を回避するには、unset() を使用して参照変数の設定を解除することをお勧めします。
この例では、参照変数 $v は、最初のループの後も $a の最後の要素への参照のままです。 2 番目のループが $a を反復するとき、ループの反復ごとに値が $v に再割り当てされます。ただし、$v は $a の最後の要素への参照であるため、その要素の値が上書きされます。
動作のステップバイステップ ガイド
さらに明確にするために、コード スニペットで何が起こるかを段階的に説明します。
解決策
回避するにはこの問題では、最初のループの後で参照変数 $v の設定を解除するだけです:
foreach ($a as &$v) { } unset($v); foreach ($a as $v) { }
以上がPHP の参照を含む Foreach ループが最後の配列要素を上書きするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。