参照渡しで foreach ループを使用すると、PHP 配列の最後の要素が重複するのはなぜですか?

Susan Sarandon
リリース: 2024-11-14 20:19:01
オリジナル
367 人が閲覧しました

Why does the last element in a PHP array duplicate when using a foreach loop with pass-by-reference?

PHP Foreach Pass by Reference: 最後の要素重複の謎が明らかに

次の PHP コードを考えてみましょう:

$arr = ["foo", "bar", "baz"];

foreach ($arr as &$item) { /* do nothing by reference */ }
print_r($arr);

foreach ($arr as $item) { /* do nothing by value */ }
print_r($arr);
ログイン後にコピー

実行すると、元の配列 $arr が予期せず変更され、次のような結果になります。出力:

Array
(
    [0] => foo
    [1] => bar
    [2] => baz
)
Array
(
    [0] => foo
    [1] => bar
    [2] => bar
)
ログイン後にコピー

動作を理解する

最初の foreach ループの後、変数 $item は $arr[2] と同じメモリ位置への参照のままになります。 。したがって、引数を値で渡す 2 番目の foreach ループの各反復では、参照された値 (したがって $arr[2]) が新しい反復の値に置き換えられます。

詳細な説明

最初のループ:

  • $item は次の値を参照します。 $arr[0]、これは 'foo' です。
  • $item と $arr[0] はどちらも 'foo' を指します。
  • このプロセスは、$arr[1] と $ に対して繰り返されます。 arr[2].

最初のループの終わりでも、$item はまだ次を指しています。 $arr[2].

2 番目のループ:

  • $item には $arr[0] の値 ('foo') が割り当てられます。
  • $arr[2] ($item によって引き続き参照される) も 'foo' に設定されます。
  • これは元のファイルを上書きします$arr[2] の 'baz' の値。
  • 同じプロセスが $arr[1] に対しても発生し、最後に $arr[2] に $arr[2] の値が割り当てられます。前回の反復により、現在は「bar」です。

明確化誤解

この動作はバグとはみなされません。これは、PHP の参照の意図された動作と一致しています。ループの外で次の構文を使用した場合にも、同様の結果が観察されます。

for ($i = 0; $i < count($arr); $i++) { $item = $arr[$i]; }
ログイン後にコピー

結論

PHP で参照を操作する場合、次のことを認識することが重要です。参照された変数を通じて行われた変更は、元の値にも影響します。この動作は、望ましい結果に応じて効果的に活用することも、回避することもできます。

以上が参照渡しで foreach ループを使用すると、PHP 配列の最後の要素が重複するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート