【问题标题】:Infinite loop in foreach depending on array initialisationforeach 中的无限循环取决于数组初始化
【发布时间】:2014-04-23 17:05:05
【问题描述】:

能否简单解释一下(因为阅读和理解How does PHP 'foreach' actually work?需要很多时间),为什么会出现这个无限循环:

$foo = array(0, 1); foreach($foo as &$v) $foo[] = 42;

而这不是:

$foo = array(0); // 1 element at initialization foreach($foo as &$v) $foo[] = 42;

也没有

$foo = array(0, 1); foreach($foo as $v) // not using a ref as foreach iterator $foo[] = 42;

?

【问题讨论】:

  • 很抱歉,学习对您来说太费时了。我自己还在等待 import to brain 功能。同时,我可以建议你付钱给真正想学习编程的人吗?
  • 我停止阅读“因为阅读和理解“'foreach' 的实际工作原理”需要很多时间”。 -_-
  • 有人投了赞成票,因为 OP 不想阅读他们引用的帖子,该帖子准确地解释了他们的要求?
  • 请阅读您发布的文档。
  • 这里有一个链接,您可以阅读以了解how a foreach loop works

标签: php arrays foreach initialization infinite-loop


【解决方案1】:

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

对于第二个数组也是同样的情况,但是执行下一次迭代的条件测试是事先完成的,所以数组扩展一无关紧要,它在该测试中被标记为终止。

第三个数组按值迭代(并因此被复制)。如果不需要对数组(或 foreach 循环中的数组值;或者数组本身不是关于它的 zval 的引用)的引用,PHP 就会这样做。所以扩展数组不会改变迭代数组(因为它是副本而不是变量中的数组)。

更多:(猜猜在哪里?)Here

【讨论】:

    【解决方案2】:

    您的第一个循环,即无限循环,正在更新循环内的数组。每次使用 [] 将新元素推送到数组的末尾时,都会使用新元素扩展数组以供 foreach 迭代。

    发生了什么:

    1. foreach 初始化
    2. 有两个元素,所以处理第一个
    3. 因为还有更多元素,所以设置了内部“继续 foreach”标志
    4. 您将一个新元素推送到数组中(现在有 3 个)
    5. foreach 从数组中获取一个新元素,并且...还有一个元素(您的新 #3),因此“继续循环”标志保持设置
    6. 您推动元素 #4,依此类推。

    对于其他数组,您从单个元素开始

    1. foreach 初始化
    2. 只有一个元素,所以处理它
    3. 在第一个元素之后没有更多元素,因此设置了“结束循环”标志
    4. 你推送你的新元素
    5. 循环终止,因为在您推送新元素之前执行了继续测试。

    基本上,您在 PHP 前面将一根胡萝卜绑在一根棍子上,而它只是跟在胡萝卜后面。

    【讨论】:

    • 在第三种情况下,循环是在数组的副本上执行的,因此将新元素推入它不会影响执行循环的副本。
    猜你喜欢
    • 1970-01-01
    • 2016-04-17
    • 2017-04-21
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多