在php中重置for循环的指针

时间:2015-04-13 16:14:56

标签: php for-loop

给出以下代码

<?php
$a = array(1,2,3,4,5,6);
$c=0;
foreach($a as $v){
    if($v==5&&$c==0){
        $c=1;
        reset($a);
    }
    var_dump($v);
}

如何重置指针以便打印1,2,3,4,5,1,2,3,4,5,6?

我知道在这种情况下我可以简单地

<?php
$a = array(1,2,3,4,5,6);
$c=0;
for($i=0;$i<count($a);++$i){
    $v = $a[$i];
    if($v==5&&$c==0){
        $c=1;
        $i=-1;  //because of the loop ++$i
    }
    var_dump($v);
}

但是我有一个更复杂的代码片段,解决方案并不像重写循环那样简单(不是数字键)。

那里的任何PHP大师可以帮助我吗?

2 个答案:

答案 0 :(得分:6)

记录在案:

  

注意:当foreach首次开始执行时,内部数组指针会自动重置为数组的第一个元素。这意味着您不需要在foreach循环之前调用reset()。

     

由于foreach依赖于内部数组指针,在循环内更改它可能会导致意外行为

http://php.net/manual/en/control-structures.foreach.php

不确定&#34;意外行为&#34;是的,因为我从来没有尝试过这个...但是手动使用每个()可能更安全......在你的代码中也更清晰。

reset($a);
while(list($key, $val) = each($a)) {
    if($val==5&&$c==0){
        $c=1;
        reset($a);
    }
    var_dump($val);
}

解释了Foreach问题

我以为我之前已经看过你不能依赖foreach中的内部指针...但这次在文档中找不到它......只有&#34;意外结果& #34 ;.但是,感谢评论者,我发现以前的文本是在foreach中:

  

除非引用了数组,否则foreach 对指定数组的副本进行操作,而不是对数组本身进行操作。 foreach对数组指针有一些副作用。在foreach期间或之后不要依赖数组指针而不重置它。&#34;

http://php.net/manual/en/control-structures.foreach.php#114759

答案 1 :(得分:2)

如果您是OOP的粉丝,可以使用ArrayIterator类。

它的方法rewind()reset() function

相同
$a=array(1,2,3,4,5,6);//or $a=range(1,6);

$i=new ArrayIterator($a);

$c=0;

foreach($i as $k=>$v)
{
    if($v==5&&$c==0)
    {
        $c=1;
        $i->rewind();
    }
    var_dump($v);
}

unset($i);//delete the iterator, to free memory

您可以在http://writecodeonline.com/php/http://sandbox.onlinephpfunctions.com/

上在线测试

@KevinNelson的答案是正确的方法,但对于未经训练的人来说,这一点并不明显。


此代码存在问题。
由于迭代,数字1不会在第二次回响。

但我有2个 franken-solutions

解决方案1:使用方法next()跳过可忽略的元素

$a=array(0,1,2,3,4,5,6);//or $a=range(0,6);

$i=new ArrayIterator($a);

$c=0;

$i->next();//jumps over the 1st element

foreach($i as $k=>$v)
{
    if($v==5&&$c==0)
    {
        $c=1;
        $i->rewind();
    }
    var_dump($v);
}

unset($i);

解决方案2:使用&#39; falsy&#39;创建一个元素价值(0nullfalse'' ...)并在循环中忽略它

$a=array(0,1,2,3,4,5,6);//or $a=range(0,6);

$i=new ArrayIterator($a);

$c=0;

foreach($i as $k=>$v)
{
    if($v==5&&$c==0)
    {
        $c=1;
        $i->rewind();
    }
    if($v)var_dump($v);
}

unset($i);