2015-02-05 69 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