可以在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技巧。
答案 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