我使用了下面给出的相同逻辑的函数 鉴于以下代码是我使用的相同逻辑的样本,我需要在迭代结束后继续for循环,我在结束时将0分配给变量$ j,这样forloop需要继续,为什么它关闭了进程。
for($i=$j;$i<7;$i++){
echo "<br/>".$i;
if($i == 6){$j=0;continue;}
}
实际输出
1
2
3
4
5
6
预期输出
1
2
3
4
5
6
1
2
3
4
5
6
.....etc
我的原始代码示例
foreach($Qry_Rst as $key=>$Rst_Val){
for($j=$ItrDt;$j<7;$j++){
$ItrDate = date('Y-m-d', mktime(0, 0, 0, $month, $day + $j, $year));
if($ItrDate == $Rst_Val['sloat_day']){
$TimeTableAry[$loop_itr] = $Rst_Val;
break
}
}
}
答案 0 :(得分:2)
第一个表达式(expr1)在循环开始时无条件地计算(执行)一次。
因此,只需使用$j
代替$i
来重置循环。就这样(demo)
$j = 1;
$current = 0;
for ($i=$j; $i<4; $i++) {
printf("i: %d, j: %d\n", $i, $j);
if ($i==3 && $current < 5) {
$i = -1;
$j = mt_rand(0,3);
$current++;
continue;
}
}
显示,您实际上需要重置$i = -1;
,以便在评估0
后$i++
。{/ p>
但是有了这个,你在循环的每次迭代中都会有if
,尽管你只需要一个。基本上你不需要它来进行迭代本身,但只是为了开始下一个,所以这里必须有其他东西。
function doFor($data, $callback) {
$dataLength = count($data);
for ($i=0; $i<$dataLength; $i++) {
call_user_func($callback, $data[$i]);
}
return $data;
}
将循环隔离到自己的函数中将允许一行执行所需的callback
,允许您的主代码类似于(demo)
$data = array(array("foo","bar"),array("hello"),array("world","!"));
function justDump($obj) {
var_dump($obj);
};
$i = 0;
do {
$data = doFor($data, 'justDump');
print "<br>";
$i++;
} while($i<5);
答案 1 :(得分:0)
你也可以尝试你原来想要的方式(只是略微编辑):
//counter to avoid infinite loop
$counter = 0;
for($i=$i;$i<7;$i++){
echo "<br/>".$i;
if($i == 6){
$i=0;
$counter++;
continue;
}
if($counter == 5){break;}
}
1
2
3
4
5
6
1
2
3
...