如果当前循环为0,则继续下一个for循环

时间:2014-01-22 20:54:17

标签: php loops for-loop zero

这似乎是编程逻辑的一般问题,因为这个问题似乎出现在我的代码中,无论它编码的语言是什么。

基本上我在for循环中有2个嵌套for循环。这些for循环的目的是枚举两组值之间的所有可能值。

代码的问题在于,第二组值包含0,值不会枚举。

比如说我们要枚举0,0,0和1,1,1之间的所有值,这样可以很好地处理每个嵌套循环。但是,我们尝试在0,0​​,0和0,1,0之间计算,循环不会继续到下一个循环,而是退出循环并继续执行其余代码。

for ($i1=$coords1[0]; $i1<=$coords2[0]; $i1++) { //if $coords2[0] = 0 loop will fail
  for ($i2=$coords1[1]; $i2<=$coords2[1]; $i2++) { //if $coords2[1] = 0 loop will fail
    for ($i3=$coords1[2]; $i3<=$coords2[2]; $i3++) {//if $coords2[2] = 0 loop will fail
      $blocks.= $i1.",".$i2.",".$i3."|";
    }
  }
}
return $blocks;

完整代码:PHPFIDDLE

5 个答案:

答案 0 :(得分:1)

好的,要从我们的聊天中复制一遍,我相信这就是解决方案:

<?php
$set1 = explode(",", '1,0,1');
$set2 = explode(",", '1,1,0');

$allbetween = _allbetween($set1, $set2);
echo 'All Between: '.$allbetween.'<br/>';
$allcount = count(explode("|", $allbetween))-1;
echo 'Number Of Blocks: '.$allcount;

function _allbetween($coords1, $coords2) {
$blocks = "";

    for ($i=0; $i<=2; $i++) {
        if ($coords1[$i] > $coords2[$i]) {
            $tmp = $coords1[$i];
            $coords1[$i] = $coords2[$i];
            $coords2[$i] = $tmp;
        }
    }

for ($i1=$coords1[0]; $i1<=$coords2[0]; $i1++)
  {
        for ($i2=$coords1[1]; $i2<=$coords2[1]; $i2++)
            {
                for ($i3=$coords1[2]; $i3<=$coords2[2]; $i3++)
                    {
                        $blocks.= $i1.",".$i2.",".$i3."|";
                    }
            }
  }
return $blocks;
}
?>

DEMO HERE

这样做的原因是函数开头有一个交换循环,如果第一个值大于第二个值,它会交换三组值中的任何一个。这确保了可以计算它们之间的所有值。

修改:将演示链接修复为正确的网址

答案 1 :(得分:0)

休息;会做。请参阅链接中的更多信息:

http://www.php.net/manual/en/control-structures.break.php

答案 2 :(得分:0)

当您将每个初始值设置为结束范围值时,您的循环将永远不会循环。而是使用:

for ($i1=0; $i1<=$coords2[0]; $i1++)
...
etc

就跌倒而言,请尝试以下方法:

for ($i1=0; $i1<=$coords2[0] + 1; $i1++)
...
etc

答案 3 :(得分:0)

问题在于:倾销你的两个$ coords数组:

$ coords1:

array(3) {
  [0]=>
  string(1) "0"
  [1]=>
  string(1) "0"
  [2]=>
  string(1) "1"
}

$ coords2:

array(3) {
  [0]=>
  string(1) "1"
  [1]=>
  string(1) "0"
  [2]=>
  string(1) "1"
}

在你的第一次迭代中:

   $coords1[0] => 1 
   $coords2[0] => 0

   1 <= 0 -> FALSE

所以你的最外面的循环根本不会执行。

答案 4 :(得分:-2)

我认为你在寻找

GOTO function

而对于

Continue function