我有整数数组。我需要使用运行良好的特定算法对整数进行分组。问题是我陷入了永远的循环。
我创建的算法将数组的两个元素与一些数字进行比较,当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
答案 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是否大写。