php foreach為什麼要複製一個陣列出來操作

WBOY
發布: 2016-08-18 09:16:29
原創
1189 人瀏覽過

目的是什麼 求過程

回覆內容:

目的是什麼 求過程

啥意思啊!恕我愚鈍,你要表達什麼意思啊?

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在循環開始前, 呼叫nextend時, 會改變數組指針位置,而在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>
登入後複製
相關標籤:
php
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!