首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

PHP foreach 與 while(each) 連用只輸出一個?數組內部指針是關鍵

     編輯:程式設計綜合問答

現象:foreach 遍歷關聯數組後,緊接 while(list($k,$v)=each($arr)) 無輸出。調換順序則正常。為什麼?

根本原因:foreach 會將內部指針移到末尾

  • 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 "; } // 無輸出

解決方案:reset() 重置指針

foreach ($arr as $k=>$v) { /* ... */ }
reset($arr); // 關鍵:將指針指回第一個元素
while (list($k,$v)=each($arr)) { /* ... */ } // 正常輸出

最佳實踐:別混用,統一用 foreach

  • foreach:語法清晰、支持引用賦值、PHP 7+ 性能極佳
  • each() / current() / next() / prev() / reset() / end():PHP 7.2 棄用,8.0 移除
  • 需操作指針時用 ArrayIterator / ArrayObject(SPL)

補充:foreach 的兩種模式

// 值模式(複製值)
foreach ($arr as $v) { $v = 99; } // 不影響原數組

// 引用模式(修改原值)
foreach ($arr as &$v) { $v = 99; } // 影響原數組
unset($v); // 重要:打破引用,避免後續誤用

總結:foreach 後接 each 必須 reset(),但現代代碼應完全拋棄 each() 族函數,統一用 foreach 或 SPL 迭代器。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved