<?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)之后的值)..
答案 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)*/