开发者社区> 问答> 正文

PHP Foreach通过引用传递:最后一个元素重复吗?

我刚编写的简单php脚本有一些非常奇怪的行为。我将其减少到重新创建该错误所需的最低限度:

输出:

Array ( [0] => foo [1] => bar [2] => baz ) Array ( [0] => foo [1] => bar [2] => bar ) 这是应该发生的错误还是某些真正奇怪的行为?

展开
收起
保持可爱mmm 2020-02-06 23:18:28 427 0
1 条回答
写回答
取消 提交回答
  • 在第一个foreach循环之后,$item仍然是对的引用,该值也被所使用$arr[2]。因此,第二个循环中的每个foreach调用(不是通过引用调用)都会替换该值,并因此替换$arr[2]为新值。

    因此,循环1的值$arr[2]变成了$arr[0]'foo'。 循环2,值和$arr[2]变为$arr[1],即“ bar”。 循环3,值and $arr[2]变为$arr[2],它是“ bar”(由于循环2)。

    实际上,在第二个foreach循环的第一次调用中,值“ baz”实际上丢失了。

    调试输出 对于循环的每次迭代,我们将回显的值,$item并递归地打印array $arr。

    运行第一个循环时,我们看到以下输出:

    foo Array ( [0] => foo [1] => bar [2] => baz )

    bar Array ( [0] => foo [1] => bar [2] => baz )

    baz Array ( [0] => foo [1] => bar [2] => baz ) 在循环结束时,$item仍指向与相同的位置$arr[2]。

    当第二个循环运行时,我们看到以下输出:

    foo Array ( [0] => foo [1] => bar [2] => foo )

    bar Array ( [0] => foo [1] => bar [2] => bar )

    bar Array ( [0] => foo [1] => bar [2] => bar ) 您会注意到每个时间数组如何将一个新值放入中$item,它也$arr[3]使用相同的值进行更新,因为它们都仍指向相同的位置。当循环到达数组的第三个值时,它将包含该值,bar因为它只是由该循环的上一次迭代设置的。

    是虫子吗? 否。这是引用项目的行为,而不是错误。这类似于运行类似的内容:

    for ($i = 0; $i < count($arr); $i++) { $item = $arr[$i]; } foreach循环本质上并不特殊,它可以忽略引用的项目。就像在循环外一样,每次都只是将变量设置为新值。

    问题来源于stack overflow

    2020-02-06 23:18:47
    赞同 展开评论 打赏
问答分类:
PHP
问答地址:
问答排行榜
最热
最新

相关电子书

更多
阿里云栖开发者沙龙PHP技术专场-深入浅出网络编程与swoole内核-吴镇宇 立即下载
PHP安全开发:从白帽角度做安全 立即下载
PHP 2017.北京 全球开发者大会——高可用的PHP 立即下载