首頁 > 後端開發 > php教程 > 為什麼在使用帶有參考傳遞的 foreach 迴圈時,PHP 陣列中的最後一個元素會重複?

為什麼在使用帶有參考傳遞的 foreach 迴圈時,PHP 陣列中的最後一個元素會重複?

Susan Sarandon
發布: 2024-11-14 20:19:01
原創
456 人瀏覽過

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

PHP Foreach 透過引用傳遞:最後一個元素重複之謎揭開

考慮以下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] 相同的記憶體位置的引用。因此,第二個 foreach 迴圈的每次迭代(以值傳遞參數)都會以新迭代的值取代引用的值(因此 $arr[2])。

詳細說明

在第一個循環中:

  • $item 引用$arr[0] 處的值,即'>
  • $item 引用$arr[0] 處的值,即' foo'。
  • $item 和 $arr[0 ] 都指向 'foo'。
  • 對 $arr[1] 和 $arr[2] 重複此程序。

在第一個循環結束時,$item 仍然指向 $arr[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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板