这是一个关于在 PHP 中实现 foreach
的方式背后的原因的好奇问题。
考虑:
$arr = array(1,2,3);
foreach ($arr as $x) echo current($arr) . PHP_EOL;
将输出:
2
2
2
我知道 foreach
将数组指针倒回开头;但是,为什么它只增加一次呢?魔盒里面发生了什么??这只是一件(丑陋的)人工制品吗?
感谢@NickC——对于任何对 zval
和 refcount
感兴趣的人,您可以阅读基础知识 here
最佳答案
就在第一次迭代之前,$array
被“软复制”以用于 foreach
。这意味着没有进行实际的复制,只是将$array
的zval的refcount
增加到2
。
第一次迭代:
- 值被提取到
$x
。 - 内部数组指针移动到下一个元素,即现在指向
2
。 current
是通过引用传递的$array
调用的。由于引用 PHP 不能再与循环共享zval
并且它需要被分离(“硬拷贝”)。
在接下来的迭代中,$array
zval 不再与 foreach
zval 相关。因此它的数组指针不再被修改,并且 current
总是返回相同的元素。
对了,我在foreach copying behavior上写了一个小总结.它可能在上下文中很有趣,但它与问题没有直接关系,因为它主要讨论的是硬拷贝。
关于php - 为什么 PHP 的 foreach 将其数组的指针(仅)前进一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8263293/