PHP - 为每个循环永远持续

时间:2014-12-02 21:46:03

标签: php arrays algorithm

我有整数数组。我需要使用运行良好的特定算法对整数进行分组。问题是我陷入了永远的循环。

我创建的算法将数组的两个元素与一些数字进行比较,当when语句为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组。

将此数组分成组后,我的输出需要如下所示:

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

1 个答案:

答案 0 :(得分: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。但是,需要加起来7个中的10个值分别为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) }

你必须改变一些基本的东西。例如,重新计算循环的每次迭代的组编号。

其他说明...... 如果您要使用小写,请使用全部小写。如果您要使用骆驼,请使用所有骆驼。始终如一。如果总数和&amp ;,那么必须查找它很烦人。 arrlength是否大写。