如何在php中强制foreach重置

时间:2014-03-03 15:12:11

标签: php foreach

可以在php中重置foreach吗?

例如:

foreach($rows as $row)
{
  if(something true)
  {
     continue foreach;
  }
  else
  {
     break;
     reset foreach;//I mean start foreach again...
  }
}

----------------------------------被修改

感谢我的朋友给你答案......

条件从foreach的结果生成所以我不能使用函数。 我在很多DIV html中通过(例如)字母表来调整它。 我无法通过SQL过滤相同共振的结果。

所以mybe我必须使用css技巧。

6 个答案:

答案 0 :(得分:5)

你可以围绕这些行做些事情(并避免递归的限制):

while (True) {
    $reset = False;
    foreach ($rows as $row) {
      if(something true) {
         continue;
      } else {
          $reset = True;
          break;
      }
    }
    if ( ! $reset ) {
        break; # break out of the while(true)
    }
    # otherwise the foreach loop is `reset`
}

答案 1 :(得分:2)

似乎reset内的foreach无效。

如果您自己创建Traversable,则可以实现此目的。

答案 2 :(得分:1)

我认为你可以通过将for each放在一个函数中然后从它自己调用函数来实现。

function doForEach($rows) {
    foreach($rows as $row)
    {
        if(something true)
        {
            continue foreach;
        }
        else
        {
            break;
            doForEach($rows);
        }
    }
}

但要小心这一点,你可能最终会陷入困境。

答案 3 :(得分:1)

为什么重置foreach?如果你真的需要这个......但要关心无限循环!

function myForeach($array){
    foreachforeach($rows as $row){
        if(something true){
           continue foreach;
        }else{
           myForeach($array);
        }

答案 4 :(得分:1)

根据手册尝试使用reset / while / each功能等同于foreach,然后你可以在循环中使用reset,如下所示:

<?php
$arr = array(1=>'one',2=>'two',3=>'three');
reset($arr);
$resets=0;
while (list($key, $value) = each($arr))
{
    echo "$key => $value<br />\n";
    if($value=='three')
    {
        if($resets==0){$resets++;echo "==Resetting==<br />\n";reset($arr);continue;}
    }

}

输出:

1 => one
2 => two
3 => three
==Resetting==
1 => one
2 => two
3 => three

答案 5 :(得分:0)

是的,可以重置foreach,但不能重置问题中的描述方式。您可以在下面阅读我的方法。

---------实现迭代器--------------------------------

实现Iterator接口。

链接:http://nl1.php.net/manual/en/class.iterator.php

代码示例:

class myIterator implements Iterator {

    private $maxIterations = 2; // the maxumum amount of iterations
    private $currentIteration = 1; // the current iteration number

    private $lastKey = null;
    private $lastValue = null;
    private $currentValue = null;

    private $position = 0;

    private $array;


    public function __construct($array) {
        $this->array = $array;
        end($array);
        $this->lastKey = key($array);
        $this->lastValue = current($array);
    }

    public function rewind() {
        $this->position = 0;
        reset($this->array);
    }

    public function valid() { 
        // Reset when there are no elements
        if($this->position > $this->lastKey && 
           $this->currentValue === $this->lastValue &&           
           $this->currentIteration < $this->maxIterations){

           $this->rewind();
           ++$this->currentIteration;
        }
        $isSet = isset($this->array[$this->position]);
        return $isSet;
    }

    public function current() {
        $this->currentValue = $this->array[$this->position];
        return $this->currentValue;
    }

    public function key() {
        return $this->position;
    }

    public function next() {
        ++$this->position;
    }
}

$array = array("A",
      "B",
      "C",
);
$it = new myIterator($array);

// the iterator will traverse the array twice
foreach($it as $key => $value) {
    echo 'key : ' . $key . '<br>';
    echo 'val : ' . $value . '<br>';
    echo '<br>';
}

输出

key : 0
val : A

key : 1
val : B

key : 2
val : C

key : 0
val : A

key : 1
val : B

key : 2
val : C

--------- InfiniteIterator + LimitIterator --------------------------------

您可以将InfiniteIterator与LimitIterator结合使用。

$obj = new stdClass();
$obj->Mon = "Monday";
$obj->Tue = "Tuesday";
$obj->Wed = "Wednesday";
$obj->Thu = "Thursday";
$obj->Fri = "Friday";
$obj->Sat = "Saturday";
$obj->Sun = "Sunday";

$infinate = new InfiniteIterator(new ArrayIterator($obj));
foreach ( new LimitIterator($infinate, 0, 14) as $value ) {
    print($value . PHP_EOL);
}

// OUTPUT: 
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday

查看链接:http://php.net/manual/en/class.infiniteiterator.php

--------- ArrayObject + ArrayIterator --------------------------------

根据PHP手册,也应该可以通过使用ArrayIterator来实现。

  

当您要遍历同一数组多次时,需要   实例化ArrayObject并使其创建ArrayIterator实例   通过使用foreach或调用它来引用它   手动使用getIterator()方法。

我不清楚他们的描述,但认为它们的意思是这样的。

$array = array('honda', 'toyota', 'suzuki', 'mazda', 'nissan');

end($array);
$lastKey = key($array);
$maxIterations = 2;
$currentIteration = 1;
$arrayObj = new ArrayObject($array);
for($iterator = $arrayObj->getIterator(); $iterator->valid(); $iterator->next()){

    echo $iterator->key() . ' : ' . $iterator->current() . '<br>';

    if( $iterator->key() === $lastKey &&
        $currentIteration < $maxIterations ){

        $iterator->rewind();
        ++$currentIteration;

        echo $iterator->key() . ' : ' . $iterator->current() . '<br>';
    }
}

输出:

0 : honda
1 : toyota
2 : suzuki
3 : mazda
4 : nissan
0 : honda
1 : toyota
2 : suzuki
3 : mazda
4 : nissan

链接:http://php.net/manual/en/class.arrayiterator.php