php中foreach
1. PHP foreach 遍歷修改值的正確方法與踩坑!
基礎使用:foreach在PHP中提供了一種簡潔的遍歷數組的方式。它僅適用於數組和對象。嘗試應用於其他數據類型的變數或未初始化的變數將導致錯誤信息。
使用foreach時,有兩種格式進行遍歷。第一種格式直接遍歷給定的array_expression數組。每次循環中,當前單元的值被賦給$value,同時數組內部的指針向前移一步,以獲取下一個單元。第二種格式與第一種類似,但同時還會將當前單元的鍵名賦給變數$key。
PHP的數組實質上是一個鍵值對形式的映射。在不指定key的情況下,如上代碼中的$a變數就是只定義了$value而沒有定義$key的數組,數組的下標分別為0、1、2,對應的值分別為2、4、8。
$b變數定義了$key和$value,說明在PHP中數組下標可以是自定義的。如果未定義下標,則默認從0開始計數數組下標。
這就是使用foreach對PHP數組進行遍歷的方法。若要在遍歷的同時修改數組中的值,應這樣做:
注意,在$value變數前添加了&符號,以將遍歷到的值的引用賦給$value。如果不添加&,賦值操作將無效。
使用此方法後,數組中的值將變為20、40、80。
使用&後,繼續遍歷$a查看值,結果為:
如果不使用unset()銷毀該引用,則輸出結果為:
為什麼會出現這種情況?我們將分步解析整個過程:
循環1-1:由於$v是一個引用,因此$v = &$a[0],$v = $v * 10相當於$a[0] * 10。此時,$a = [20, 4, 8]。
循環1-2:$v = &$a[1],$v = $v * 10相當於$a[1] * 10。此時,$a = [20, 40, 8]。
循環1-3:$v = &$a[2],$v = $v * 10相當於$a[2] * 10。此時,$a = [20, 40, 80]。
循環2-1:隱含操作$v = $a[0]被觸發,由於$v仍是$a[2]的引用,相當於$a[2] = $a[0]。此時,$a = [20, 40, 20]。
循環2-2:$v = $a[1],此時$v仍是$a[2]的引用,即$a[2] = $a[1]。此時,$a = [20, 40, 40]。
循環2-3:$v = $a[2],此時$v仍是$a[2]的引用,即$a[2] = $a[2]。此時,$a = [20, 40, 40]。
為解決此問題,PHP官方文檔建議使用unset()銷毀最後一個元素的引用。
遇到問題時,優先查找官方文檔,這很可能直接解決問題。當然,如果這篇白話解讀解決了你的問題,請點個贊吧!