2014-01-22 42 views
2

看来这是编程逻辑的一个一般性的问题,因为这个问题似乎在我的代码出现,无论用什么语言它真实编码。继续下一个for循环,如果电流回路0

基本上我有2套for循环,在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

+0

嗯......你会觉得,因为你使用的是在你的榜样,嵌套循环应至少执行一次,'<='为您评估。看着你的代码,似乎它会工作得很好...... /思考上限。 – Charlie74

+1

我用Javascript重新创建了你的代码,它似乎工作正常。看看这里:http://jsfiddle.net/9A5dL/。如预期的那样,使用000,111生成8个响应。如预期的那样,使用000,010会生成2个响应,这看起来是否适合您? (确保在运行代码时打开JS控制台) – Charlie74

+0

下面是我的服务器上托管的脚本的完整示例。你可以在[LINK1]中看到(http://projectbuilder.info/blockcalc.php?coord1=1,0,1&coord2=1,1,1)(比较1,0,1和1,1,1)计算按预期执行,但在[LINK2](http://projectbuilder.info/blockcalc.php?coord1=1,0,1&coord2=1,1,0)中(比较1,0,1和1,1, 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

这部作品的原因是,在你的函数开始交换循环,如果第一组大于第二组,则交换三组值中的任何一组。这确保了可以计算它们之间的所有值。

编辑:固定的演示链接到正确的URL

0

你的循环将永远循环,你正在将每个初始值设置为结束范围值。而是使用:

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

在秋天穿的方面,请尝试以下操作:

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

情况并非如此.....我的脚本从一个值计算另一个值(计算所有值之间的值)将初始计数设置为0,并将最终计数值加1,导致计数结果不准确。见[link](http://projectbuilder.info/blockcalc.php?coord1=1,0,1&coord2=1,1,1)和[link](http://projectbuilder.info/blockcalc.php?coord1= 1,0,1&coord2 = 1,1,0) –

+0

@joshd:循环正在从坐标** 1 **初始化,然后对坐标** 2 **进行测试。即使他们在同一个数组上进行初始化/测试,循环也应至少运行一次,因为比较结果是“<=”,而不是“<”。 –

+0

你是对的。对困惑感到抱歉!在那种情况下,你是否使用while而不是for循环? – joshd

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 

让你最外层循环永远不会执行的。

+0

我知道这是问题,但我需要强制执行循环,即使它们最初返回的值为false(并因此不执行任何操作)。编辑:我需要这样做而不改变数值,因为这会产生无效的计算。 –

+0

为什么?你试图将“false”重新定义为“true”,这意味着你的循环永远不会终止,因为条件永远不会变成“真实假”,而只是你的“假假”。 –

+0

也许按照降序对数组进行排序可能会有所帮助,只要您按照相同的方式排序即可。这会将零值放在数组的末尾,直到处理完非零值后才会终止。 –