2
<?php
$a = array(1, 2, 3, 4, 5);
foreach ($a as $key => $elem) {
    echo "$key = $elem"; echo ' = ';
    var_dump(current($a));\
}
?>

我运行时得到的输出如下:

0 = 1 = int(2)

1 = 2 = int(2)

2 = 3 = int(2)

3 = 4 = int(2)

4 = 5 = int(2)

在我看来,这是我应该得到的输出?:

0 = 1 = int(1)

1 = 2 = int(2)

2 = 3 = int(3)

3 = 4 = int(4)

4 = 5 = int(5)

我在 $a 上的 for 循环之前执行 current() 并获得 int(1)。因此,似乎是导致它增加的 foreach 循环。但如果是这样,为什么它只做一次呢?

如果我在 for 循环中调用 next() 它会增加,但不会增加。当然 next() 从 int(3) 开始(即 int(2) 之后的值)..

4

3 回答 3

1

通过阅读有关 current 的 PHP 文档,您似乎不应该期望 foreach 移动当前指针。

请参阅: http: //php.net/manual/en/function.current.php

有点令人困惑的是,每个函数确实移动了当前指针。因此,如果您使用 each 而不是 foreach 将数组重写为循环,那么您将获得所需的当前行为。

这是用 each() 重写的示例,它产生了预期的结果:

<?php
$a = array(1, 2, 3, 4, 5);
while ( list($key,$elem) = each($a)) {
    echo "$key = $elem"; echo ' = ';
    var_dump(current($a));
}
?>
于 2012-12-12T13:39:31.693 回答
0

current()使用内部标志(指针),而 foreach 使用它自己的。

如果你想这样做(这有点傻,因为你在 $key 中有密钥)你可以使用ArrayIterator

于 2012-12-12T13:37:53.407 回答
0

我只是偶然发现了同样的问题,我相信我有一个理论。Foreach 不会按值访问数组元素,它会创建自己的副本。但是,在执行此操作时,它只会将 current() 返回的值增加一次。

要检查这一点:

<?php

$a = [0, 1, 2];
    foreach ($a as &$val){ // accessing the array elts by reference this time
    var_dump(current($a));
}

/*this outputs:
int(1)
int(2)
bool(false)*/ 
于 2021-04-13T18:42:43.427 回答