gpt4 book ai didi

php-internals - PHP 的 foreach() 如何成功嵌套在单个数组上?

转载 作者:行者123 更新时间:2023-12-01 00:52:07 25 4
gpt4 key购买 nike

考虑以下代码:

$a = [1, 2, 3];

foreach ($a as $x) {
foreach ($a as $y) {
echo "$x $y\n";
}
}
正如人们所料,它给出了以下结果:
1 1
1 2
1 3
2 1
2 2
2 3
3 1
3 2
3 3
虽然对结果很满意,但我很惊讶它的工作原理,因为根据 manual ,它依赖于数组的内部指针:

When foreach first starts executing, the internal array pointer is automatically reset to the first element of the array. This means that you do not need to call reset() before a foreach loop.

As foreach relies on the internal array pointer, changing it within the loop may lead to unexpected behavior.


所以我们可以期望使用嵌套的 foreach在第一个内部,将共享相同的内部指针,并产生以下结果:
1 1
1 2
1 3
因为第一个 foreach将看到嵌套 foreach 留下的内部指针的状态.
我可以想到对实际行为的两种可能的解释:
  • PHP 手册是错误的/过时的,PHP 使用特定于每个 foreach 的单独指针。 ;
  • 嵌套foreach在内部触发内存中数组的复制,因此它们每个都有自己的指针。

  • 只为我的文化, 这是如何在内部工作的?

    最佳答案

    简短的回答。在这种情况下,PHP 确实复制了数组(即数组结构)。 Foreach 可以在各种场景中做到这一点,以防止出现此类问题。有些人认为 foreach 总是复制数组,但事实并非如此(那将是低效的)。

    我找到了一篇很棒的博客文章,更详细地描述了这种行为:

    PHP internals: When does foreach copy?

    摘要:

  • foreach将复制数组结构当且仅当迭代
    数组未被引用且引用计数 > 1
  • foreach将要
    另外复制数组值当且仅当前一个点
    适用,迭代通过引用
  • 完成

    关于php-internals - PHP 的 foreach() 如何成功嵌套在单个数组上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30544805/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com