現象:foreach 遍歷關聯數組後,緊接 while(list($k,$v)=each($arr)) 無輸出。調換順序則正常。為什麼?
foreach 執行時,會將數組內部指針逐步後移,結束時指向「結束位置」(NULL)each() 返回當前指針位置的鍵值對並後移指針each() 直接返回 false → while 不執行$arr = ['a'=>1, 'b'=>2, 'c'=>3];
foreach ($arr as $k=>$v) { echo "$k=$v "; } // 輸出 a=1 b=2 c=3
var_dump(current($arr)); // bool(false) 指針在末尾
while (list($k,$v)=each($arr)) { echo "$k=$v "; } // 無輸出
foreach ($arr as $k=>$v) { /* ... */ }
reset($arr); // 關鍵:將指針指回第一個元素
while (list($k,$v)=each($arr)) { /* ... */ } // 正常輸出
foreach:語法清晰、支持引用賦值、PHP 7+ 性能極佳each() / current() / next() / prev() / reset() / end():PHP 7.2 棄用,8.0 移除ArrayIterator / ArrayObject(SPL)// 值模式(複製值)
foreach ($arr as $v) { $v = 99; } // 不影響原數組
// 引用模式(修改原值)
foreach ($arr as &$v) { $v = 99; } // 影響原數組
unset($v); // 重要:打破引用,避免後續誤用
總結:foreach 後接 each 必須 reset(),但現代代碼應完全拋棄 each() 族函數,統一用 foreach 或 SPL 迭代器。