簡介:
foreach 在 PHP 中廣泛用於循環通過數組、物件和其他資料結構。了解其內部運作原理對於避免意外行為至關重要。
三種類型的 foreach 可迭代物件:
foreach 支援三種類型的可迭代物件:
可遍歷對象
foreach ($it as $k => $v) {} translates to: if ($it instanceof IteratorAggregate) { $it = $it->getIterator(); } for ($it->rewind(); $it->valid(); $it->next()) { $v = $it->current(); $k = $it->key(); // ... }
對於可遍歷對象,foreach
陣列與物件迭代:
有序字典:PHP 陣列和物件本質上是維護插入順序的有序字典。迭代遵循此順序。
物件轉換:打包物件表示在迭代期間轉換為字典。因此,普通物件迭代變得類似於數組迭代。
內部陣列指標(IAP):PHP 5 中的陣列有一個內部陣列指標(IAP),支援修改和跳過覆蓋已刪除的元素。
HashPointer:PHP 中的 foreach 5 在運行循環體之前使用 HashPointer 來備份 IAP 位置和雜湊值。如果該元素仍然存在,它會在之後恢復它;否則,它使用當前 IAP 位置。
陣列重複:PHP 5 中的 foreach 會複製非引用 (is_ref=0) 且引用計數大於 1 的陣列。
在測試案例 4 和 5 中,數組是重複的因為 by-ref 函數(each、reset)接收到重複數組的引用。
PHP 7 變更:
雜湊表迭代器: PHP 7 使用外部雜湊表迭代器,在數組中註冊。如果刪除對應的元素,每個迭代器都會前進。
foreach 不使用 IAP:foreach 不再使用 IAP,從而消除了重複的需要。按值數組迭代始終使用原始元素。
陣列重複:陣列在按值迭代期間不再重複,無論其引用計數或引用狀態如何。
PHP 7 例:其他PHP 7 增強功能:
以上是PHP 的「foreach」迴圈實際上是如何運作的,其實作在 PHP 5 和 PHP 7 之間有何變化?的詳細內容。更多資訊請關注PHP中文網其他相關文章!