Php foreach中的无限循环取决于数组初始化

Php foreach中的无限循环取决于数组初始化,php,arrays,foreach,initialization,infinite-loop,Php,Arrays,Foreach,Initialization,Infinite Loop,简而言之,你能解释一下,因为阅读和理解需要很多时间,为什么这个无限循环: $foo=array0,1; foreach$foo as和$v $foo[]=42 鉴于此不: $foo=array0;//初始化时为1个元素 foreach$foo as和$v $foo[]=42 这也不是 $foo=array0,1; foreach$foo作为$v//不使用ref作为foreach迭代器 $foo[]=42; ?您的第一个循环,无限循环,正在更新循环中的数组。每次使用[]将新元素推到数组末尾时,都

简而言之,你能解释一下,因为阅读和理解需要很多时间,为什么这个无限循环:

$foo=array0,1; foreach$foo as和$v $foo[]=42

鉴于此不:

$foo=array0;//初始化时为1个元素 foreach$foo as和$v $foo[]=42

这也不是

$foo=array0,1; foreach$foo作为$v//不使用ref作为foreach迭代器 $foo[]=42;


您的第一个循环,无限循环,正在更新循环中的数组。每次使用[]将新元素推到数组末尾时,都是在使用新元素扩展数组,以便foreach进行迭代

正在发生的是:

foreach初始化 有两个元素,所以处理第一个 因为还有更多的元素,所以设置了内部continue-the-foreach标志 你把一个新元素推到数组上现在有3个 foreach从数组中获取一个新元素,然后。。。新3中仍保留了一个元素,因此“继续循环”标志保持设置 将元素4推上,依此类推。 对于其他数组,您将从单个元素开始

foreach初始化 有一个元素,所以处理它 在第一个元素之后没有更多的元素,因此将设置end循环标志 你推动你的新元素 循环终止,因为继续测试是在推送新元素之前执行的。
基本上,您已经在PHP前面将一个胡萝卜绑在一根大棒上,它就在胡萝卜后面。

第一个数组通过引用进行迭代,作为第二个数组。这是因为迭代元素被引用&$v,因此必须影响原始数组。如果扩展数组变量,则相同的迭代数组将无限扩展

对于第二个数组,情况是相同的,但是执行下一个迭代的条件测试是事先完成的,所以数组扩展一个并不重要,它在该测试中被标记为终止

第三个数组按值进行迭代,然后进行复制。如果不需要引用foreach循环中的数组或数组值,PHP就会这样做;或者数组本身不是关于zval的参考。因此,扩展数组不会改变迭代数组,因为它是一个副本,而不是变量中的数组


更多:猜猜在哪里

很抱歉,学习对你来说太费时了。我自己还在等待大脑功能的导入。同时,我可以建议你付钱给那些真正想为你学习编程的人吗?我不再读了,因为阅读和理解“foreach”实际上是如何工作的需要很多时间-_-有人投了更高的票,因为OP不想阅读他们引用的一篇文章,这篇文章准确地解释了他们的问题?请阅读你发布的文档。这里有一个链接,你可以阅读理解。在第三种情况下,这种情况下,循环是在数组的副本上执行的,因此将新元素推送到该副本上不会影响执行循环的副本。