ホームページ >バックエンド開発 >PHPチュートリアル >参照渡しで foreach を使用した後、PHP 配列の最後の要素が重複して表示されるのはなぜですか?

参照渡しで foreach を使用した後、PHP 配列の最後の要素が重複して表示されるのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-15 00:18:021055ブラウズ

Why does the last element of a PHP array appear duplicated after using foreach with pass-by-reference?

PHP Foreach Pass by Reference: 謎の要素の重複

はじめに:

最後の参照渡しで foreach を使用して反復処理した後、PHP 配列の要素が重複して表示されますか?この不可解な動作により、潜在的なバグや奇妙なシステム動作に関する疑問が生じることがよくあります。

動作の理解:

これを理解するための鍵は、参照渡しの性質です。 PHP の foreach ループ内で。パラメーターで「&」を使用すると、配列要素への参照はコピーではなく直接変更されます。これは、ループ内で渡された変数に加えられた変更は、元の配列に直接影響することを意味します。

問題のバグ:

提供された例:

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

foreach ($arr as &$item) {}
foreach ($arr as $item) {}

最初の foreach ループは、配列要素への参照を確立します。 $item は参照になっているため、ループ内で $item を変更すると、対応する配列要素も変更されます。

ただし、2 番目の foreach ループは参照を確立しません。これは、ループが $item に新しい値を割り当てる場合、ローカル コピーにのみ影響し、元の配列は更新されないことを意味します。

重複の影響:

Now 、 $item が最後の配列要素 (つまり、「baz」) への参照である場合を考えてみましょう。最初のループでこの参照が確立されるため、2 番目のループでも同じ参照が使用されます。その結果、2 番目のループで $item に割り当てられた値はすべて $arr[2] に直接渡されます。

したがって、2 番目のループで 'bar' を $item に割り当てると、誤って最後の要素が置き換えられてしまいます。配列に「bar」が含まれているため、明らかな重複が生じます。

期待値と実際値出力:

ループ前: ["foo", "bar", "baz"]

最初のループ後 (参考): ["foo", "bar" , "foo"] ($item はまだ $arr[2] を参照しているため)

2 番目のループの後 (非参照): ["foo", "bar", "bar"]

バグですか?

いいえ、この動作はバグではありません。これは、単に PHP の foreach ループで参照を使用した場合の予想される結果です。 $item の値は、元の配列要素への参照であり、変更されるたびに基になる配列に影響を与えます。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。