理解 PHP 的 'foreach' 循環
'foreach'支援迭代三種類型的值:
可遍歷物件
數組和物件迭代
數組和物件作為有序字典進行遍歷。遍歷普通物件與遍歷陣列類似,因為它們在內部表示為有序字典。
迭代期間的內部變化
-
- 按引用數組迭代或迭代對象(按句柄語義)允許在迭代時進行循環內修改。
迭代引用計數大於 1 的陣列可能會在修改之前重複陣列。
PHP 5 方法
-
- 使用內部陣列指標 (IAP)追蹤位置。
- 另外採用 HashPointer 來支援多個同時「foreach」循環。
- 如果引用計數大於 1 且陣列不是引用,則會發生陣列重複。 IAP 推進發生在
循環體運作之前。
PHP 7方法
-
- 完全放棄 IAP 使用。
- 引入在陣列中註冊的雜湊表迭代器來處理迭代中的修改。
- 按值進行數組重複僅當在循環期間修改數組時才會發生數組迭代。
'foreach' 行為不存在不再受‘current()’或‘reset()’影響。
您問題的解答
1.這是正確的嗎?
您將「foreach」理解為使用陣列副本但影響陣列指標是正確的。然而,在 PHP 7 中,「foreach」不再使用 IAP,而是依賴雜湊表迭代器,從而產生更一致且可預測的行為。
2.它到底在做什麼?
-
- PHP 5:使用 IAP 和 HashPointer 的組合來支援迭代,在某些情況下可能會出現重複和意外行為。
PHP 7:使用不受「foreach」循環影響的雜湊表迭代器,並正確處理迭代過程中的修改迭代。
3.在某些情況下,在「foreach」期間使用調整數組指標的函數會影響循環的結果嗎?
-
PHP 5:「each()」和「reset()」可以影響巢狀「foreach」迴圈的行為,甚至可能因雜湊衝突而遇到意外行為。
-
PHP 7: 調整陣列指標的函數對「foreach」行為沒有影響,因為它不再依賴IAP。
以上是PHP 的「foreach」迴圈在 PHP 5 和 PHP 7 中如何運作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!