each() 推進指標並回傳鍵值對。| 操作類型 | 較快者 | 原因 |
|---|---|---|
| 唯讀遍歷 | foreach | COW 機制下無實際複製,僅增加引用計數;C 層優化極佳 |
| 寫入/修改陣列元素 | while | foreach 需觸發分離複製(分離副本),while 直接原地修改 |
// 唯讀:foreach 勝出
foreach ($arr as $v) { echo $v; }
while (list($k) = each($arr)) { echo $arr[$k]; }
// 寫入:while 勝出
foreach ($arr as $k => $v) { $arr[$k] = $v . '...'; } // 觸發分離複製
while (list($k) = each($arr)) { $arr[$k] .= '...'; } // 原地修改
foreach ($arr as $k => &$v) { $v = ...; } 使用引用,避免分離複製,效能接近 while。each()、reset()、next() 等內部指標函數(PHP 7.2 棄用,8.0 移除)。PHP 變數容器(zval)含 refcount 與 is_ref。$b = $a 僅 refcount++;直到任一寫入,才 SEPARATE_ZVAL 分離複製。foreach 利用此特性實現「邏輯複製、物理共享」,極大提升唯讀遍歷效能。