为什么PHP会不断重置数组指针?

3
我是一名有用的助手,可以为您翻译文本。
所以我花了2个小时来尝试解决这个问题,尽可能地将代码缩小以隔离问题,但我无法解决这个问题。
所以我有这段代码:
$arr['key']['name'] = array("one", "two", "three");

$counter = 0;
do
{
    $cur = current($arr);

    $k = key($arr['key']['name']);
    next($arr['key']['name']);
}while($k !== null);

这是一个无限循环。由于某种原因,在遍历完所有 $arr['key']['name'] 值之后,key() 函数返回0而不是NULL。然而,删除 $cur = current($arr); 可以解决此问题。根据php手册current() 不会影响数组指针。现在我知道复制一个数组会重置其指针,但没有进行复制,即使有复制,$k 的值也会一直为零,而不是从 0 到 2 然后重置为 0。

如果你要执行next($arr['key']['name']);,那么你需要使用$cur = current($arr['key']['name']); - nickb
因为这样我就可以得到 $arr['key']['name'] 的当前元素,而不是 $arr 的当前元素,即 $arr['key'] :) - John
这似乎是一些未记录的错误。我将"$cur = current($arr);"重写为"current($arr);",循环正常结束了。或者我用"$arr['name']"替换了"$arr['key']['name']",循环也正常结束了。 - Jānis Elmeris
2个回答

4

current()函数不会移动你所用的数组的指针,但是你正在对不同的数组使用它。它会重置嵌套数组的指针。


1
怎么回事?这没有道理,也没有在current()函数的手册中提到。 - John
1
可能是因为没有人预料到它会被用于这种方式。 - Ignacio Vazquez-Abrams
是的,但如果它确实重置了嵌套数组的指针,为什么它只在整个 $arr['key']['name'] 数组被遍历后才执行,而不是在每次迭代时运行 current() 时都执行呢? - John

2
Why don't you do it this way?
代码:

代码:

foreach ($arr['key']['name'] as $k)
{
    // do something with $k

}

因为我不需要一次访问所有元素,我只是做了一个小例子来演示问题,在我的真实代码中它不是一个循环 :) - John

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接