2015-02-05 64 views
1

我相當肯定答案是否定的,但是在foreach循環中可以插入一些東西到數組中嗎?理想的情況是在循環過程中你在陣列中的位置。在foreach中插入數組

例如:

foreach($stock->StockData as &$stock) {  
     if($dateTime < $stock['DateTime']) { 
      // INSERT NEW RECORD AT THIS SPOT IN THE ARRAY 
     } 
} 

正如我說的,我相當肯定的答案是否定的,但不是建立一個新的數組,我只是想我會問。

+0

請注意'&$ stock':如果不需要引用,則刪除它會更安全。 PHP沒有塊範圍,這意味着循環$ stock仍然指向最初數組的最後一項。所以如果以後你將某些東西分配給$股票,你將會有效地修改你的數組。如果您確實需要參考,您可以通過在循環後取消設置$ stock來防止此問題。 – djfm 2015-02-05 18:31:59

回答

3

我站好了!

http://docstore.mik.ua/orelly/webprog/php/ch05_07.htm

它顯然是蠻好的PHP來做到這一點。

根據參考資料,當您啓動一個foreach迭代器時,PHP會對數組的一個副本進行操作,這意味着迭代器不會受到對foreach主體內原始數組操作的破壞!

+0

聽起來是對的,我經常在迭代數組的時候取消設置,並且從來沒有遇到麻煩,所以我猜插入也沒問題。 – djfm 2015-02-05 18:29:09

+0

然後只需使用'array_splice'來插入更改。謝謝。 – 2015-02-06 13:28:20

1

真的不想改變一個對象被迭代。它會破壞你的迭代器/循環,並可能通過訪問或改變你無法訪問的內存來破壞腳本/程序,可能是因爲數組的大小減小了。

+0

@djfm請參閱: 注意: 當foreach第一次開始執行時,內部數組指針自動重置爲數組的第一個元素。這意味着你不需要在foreach循環之前調用reset()。 由於foreach依賴於內部數組指針,因此在循環內更改它可能會導致意外的行爲。 – 2015-02-05 18:37:16

+0

這通常是正確的,但請注意我提交的答案中的參考。 PHP顯然是遍歷數組的副本,而不是數組本身。這意味着你不會改變迭代的對象。 – 2015-02-05 19:20:05

+0

當然,但無論是在副本還是原件上進行迭代,如果數組中有十個項目,並且在遍歷它時,則會在中間刪除兩個項目。現在這個數組是8個項目,而你的循環正在經歷10個項目。在索引8和9處,您嘗試對項目進行變異,並且php變得繁榮起來! :D – 2015-02-05 19:26:16