2014-12-02 41 views
0

我有整數數組。我需要使用運行良好的特定算法對該整數進行分組。問題是我陷入永久循環。PHP - 對於每個循環永遠持續

我創建了一個算法,它將數組的兩個元素與某個數字進行比較,當語句爲true時,將從數組中移除兩個元素。

對於每個循環都用while循環包圍,檢查數組是否爲空(當所有元素都被刪除時它會停止),並且每個循環用於比較具有上述特定數字的數組元素。

是否有人知道什麼是錯我的代碼

CODE:

$testArray1=array(2,1,4,7,1,2,6,8); 
$group=3; 
sort($testArray1); 
$arrlength = count($testArray1); 
$totalnumber=0; 
for($x = 0; $x < $arrlength; $x++) { 
    $totalnumber+= $testArray1[$x]; 
} 
$groupNumber = round($totalnumber/$group,0); 
while (!empty($testArray1)) { 
$arrlength = count($testArray1); 

foreach($testArray1 as $key => &$val) { 
    $end=end($testArray1); 
    $number=$val+$end; 
    if ($number==$groupNumber){ 
     echo $val." , "." , ".$end.": ".$number. "<br>"; 
     unset ($testArray1[$key]); 
     array_pop($testArray1); 
     break; 

    } 
} 
} 
?> 

這裏是我真正需要做的:

比方說,我有數組是這樣的:

array(2,1,4,7,1,2,6,8); 

我需要編寫一個算法,接收兩個參數(整數數組和組數)。該數組需要按照用戶定義的組數來劃分,以便儘可能接近每個組內所有成員的總和。

這裏是例如:

我有陣列是這樣的:2,1,4,7,2,6,8和我需要將其分成3組。

在此之後陣列被分成組,我的輸出需要看起來像這樣:

GROUP 1:8,2:10 第2組:7,2,1:10 組3:6,4 ,1:11

+0

呃...如果你把這個&$ val這個? $ val它改變了什麼?那說試着編輯這個!empty($ testArray1)if(count($ testArray1)> 0){}? 「 – 2014-12-02 21:48:48

+0

」運作良好。問題在於我陷入永久循環。「*您的*工作良好的定義*有點奇怪 – 2014-12-02 21:50:17

+0

@MarcoMura我試過你的建議......現在它不會加載頁面:( – user3429355 2014-12-02 21:50:33

回答

0

總之,你的循環是無限的,因爲while條件永遠不會是真的。

我重構了一下你的代碼,以限制你在循環中操作數組的多少。我通過將數組移出while條件並將結尾移出foreach(自從您調用中斷後安全地完成)來完成此操作。我加了一個休息2來說明它爲什麼會凍結。

<?php 
$testArray1=array(2,1,4,7,1,2,6,8); 
$group=3; 
sort($testArray1); 
$arrlength = count($testArray1); 
$totalnumber=0; 
for($x = 0; $x < $arrlength; $x++) { 
    $totalnumber+= $testArray1[$x]; 
} 
$groupNumber = round($totalnumber/$group,0); 
$length = count($testArray1); 
while ($length > 0) { 
    $end=end($testArray1); // get the last element's value 
    var_dump($testArray1); 

    foreach($testArray1 as $key => $val) { 
     $number=$val+$end; 
     if ($number==$groupNumber){ 
      echo $key." - ".$val." , "." , ".$end.": ".$number. "<br>"; 
      unset ($testArray1[$key]); 
      array_pop($testArray1); 
      $length -= 2; 
      break 2; 
     } 
    } 
} 
echo "<br /><br />length: ".$length; 
echo "<br /><br />"; 
var_dump($testArray1); 
?> 

第一次while循環迭代之後,剩下的數組在末尾有7個。但是,這需要添加多達10關的7的值是1,4和6。顯然,這些都不添加到7

array(8) { [0]=> int(1) [1]=> int(1) [2]=> int(2) [3]=> int(2) [4]=> int(4) [5]=> int(6) [6]=> int(7) [7]=> int(8) } 2 - 2 , , 8: 10 


length: 6 

array(6) { [0]=> int(1) [1]=> int(1) [3]=> int(2) [4]=> int(4) [5]=> int(6) [6]=> int(7) } 

已經得到了你改變一些東西根本。例如,爲循環的每次迭代重新計算組號。

其他注意事項... 如果您要使用小寫字母,請使用全部小寫字母。如果你要使用駱駝,請使用所有駱駝。始終如一。如果totalrumber & arrlength被大寫或不是大寫,這是很煩人的。

+0

謝謝您的回答@phpmeh。你的代碼正在工作,但只有一個循環完成。我需要一遍又一遍地循環,直到所有元素都被刪除 – user3429355 2014-12-02 22:46:58

+0

這段代碼永遠不會刪除所有元素,這就是爲什麼我用中斷2來停止它,以顯示爲什麼它永遠不會刪除所有元素。我建議如何解決它。將總數代碼塊移到while循環中非​​常簡單。另外,看看array_sum。 – phpmeh 2014-12-02 22:48:41