2014-01-22 40 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

也許按照降序對數組進行排序可能會有所幫助,只要您按照相同的方式排序即可。這會將零值放在數組的末尾,直到處理完非零值後纔會終止。 –