ホームページ >バックエンド開発 >PHPチュートリアル >PHP の「foreach」ループで参照を使用すると、配列の最後の要素が予期せず変更されるのはなぜですか?
foreach with Reference (Foreach with &)
PHP では、foreach ループ内で参照を使用すると、ユーザーが注意すべき影響が生じます。この概念は、次のコード スニペットで見ることができます:
<br>$a = array('a', 'b', 'c', 'd');</p> <p>foreach ($a as &$v) { }<br>foreach ($a as $v) { }</p> <p>print_r($a);<br>
このコードは単純そうに見えますが、その動作が不可解に見える人もいるかもしれません。最初のループの実行後、配列 $a の値は変更されません。ただし、後続のループでは、$a の最後の要素が値 'a'、'b'、および 'c' で予期せず上書きされます。これは、参照 (アンパサンド記号 (&) で示される) を使用するときの PHP の foreach ループの重要な動作によるものです。
最後の要素の参照と変更
By最初のループで参照 & を使用すると、$v は配列内でトラバースされている現在の要素のエイリアスになります。 $v に変更が加えられると、実質的に $a 内の元の要素が変更されます。この場合、3 番目のループは配列を反復処理します。$v は参照ではなくなりますが、配列の変更された最後の要素 ($a[3]) を指し、それを前の反復の値で上書きします。 .
PHP 警告
この特異な動作は PHP に文書化されています。マニュアル:
警告: $value と最後の配列要素の参照は、foreach ループ後も残ります。 unset() によって参照を破棄することをお勧めします。
予期しない動作を回避するには、以下に示すように unset() を使用して参照を破棄することを検討してください。
<br>$a = array('a', 'b', 'c', 'd');</p> <p>foreach ($a as &$v) { }<br>unset($v);<br>foreach ($a as $v) { }</p> <p>print_r($a);<br>
参照の設定を明示的に解除すると、後続のループが配列内の元の値で動作するようになります。このアプローチにより、配列の内容が意図せず変更されるのを防ぎます。
以上がPHP の「foreach」ループで参照を使用すると、配列の最後の要素が予期せず変更されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。