目的是什麼 求過程
目的是什麼 求過程
啥意思啊!恕我愚鈍,你要表達什麼意思啊?
PHP foreach 不需要複製一個陣列出來操作,你從哪裡看到的需要複製一個陣列?
PHP foreach遍歷的是陣列的副本,我想大概是為了避免你一邊遍歷一邊修改(新增項目)導致死迴圈?
隨便猜測的。 。 。
題主是想知道foreach
的內部實作時, 是複製了一個臨時變數
來操作, 而不是操作實際的陣列吧
我對這個問題一直很懵懂, 以下回答僅供參考, 啊哈哈
參考 深入理解php核心
<code> [鸟哥的php foreach](http://www.laruence.com/2008/11/20/630.html) </code>
來看一個列子證明foreach
在循環是確實是複製了一個臨時變數
來操作的
<code class="php"> $arr = array(1,2,3,4,5); //该数组的下一元素为 2 echo next($arr);//2 //该数组的最后元素为 5 echo end($arr);//5 //即使上一步调用end将数组指针移到最后一位, 但在foreach开始执行时, 会重置数组指针 foreach($arr as $key => $row) { next($arr); end($arr); echo $key, '=>', $row, "\r\n";// } </code>
結果如下圖
<code class="php">2 5 0=>1 1=>2 2=>3 3=>4 4=>5 </code>
如上, foreach
在循環開始前, 呼叫next
或end
時, 會改變數組指針位置,而在foreach
裡面調用時,其循環過程
在遍歷的程式碼中通過end,next等操作數組的指針,數組的指針不會變化,這是因為在PHP內核進行FETCH操作時, 會通過中間變量存儲當前操作數組的內部指針,每遍歷一個元素,會先取得先前儲存的指標位置,取得下一個元素後,再恢復指標位置, 關鍵在於FETCH OPCODE執行過程中的中間變數
這裡就可以看出foreach
在循環時不時操作的原始數組, 而是原始數組的拷貝,
好現在來回答題主的問題, 為什麼要copy一個數組來操作而不是操作原數組, 我的想法是, 若foreach
操作的是原數組, 那麼在foreach
裡改變原數組的值, 或新增元素, 那麼會怎麼樣呢,題主這樣想是不是就能明白了,
<code class="php">foreach ($variable as $key => $value) { $variable[''] => mt_rand(1, 111); }</code>