foreach和current

时间:2012-12-12 13:27:34

标签: php foreach

<?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)之后的值)..

3 个答案:

答案 0 :(得分:1)

从阅读关于当前的PHP文档,看起来你应该期望foreach移动当前指针。

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

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

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分: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)*/