PHP - для каждого цикла длиться вечно

0

У меня есть массив целых чисел. Мне нужно сгруппировать это целое число с использованием специального алгоритма, который работает хорошо. проблема в том, что я застрял навсегда.

Я создал алгоритм, который сравнивает два элемента массива с некоторым числом, и когда оператор истинен, два элемента удаляются из массива.

Для каждого цикла окружен циклом while, который проверяет, является ли массив пустым (он останавливается, когда все элементы удаляются), и что для каждого цикла используется для сравнения элементов массива с определенным числом, как упомянуто выше.

Кто-то знает, что не так с моим кодом

КОД:

$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
    хм ... если вы положите это & $ val к этому? $ val это что-то меняет? Тем не менее попытался изменить это! Empty ($ testArray1) с помощью if (count ($ testArray1)> 0) {}?
  • 0
    «работает хорошо. проблема в том, что я застрял в вечном цикле.» ваше определение работы хорошо немного странно
Показать ещё 13 комментариев
Теги:
arrays
algorithm

1 ответ

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 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 );
?>

После первой итерации цикла, оставшийся массив имеет 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) }

Вы должны изменить что-то фундаментальное. Например, пересчитайте номер группы для каждой итерации цикла.

Другие примечания... Если вы собираетесь использовать строчные буквы, используйте все строчные буквы. Если вы собираетесь использовать верблюд назад, используйте все верблюды. Быть последовательным. Это раздражает необходимость поиска, если totalnumber & arrlength капитализируются или нет.

  • 0
    Спасибо за ответ @phpmeh. Ваш код работает, но выполнен только один цикл. Мне нужно повторять снова и снова, пока все элементы не будут удалены
  • 0
    Этот код никогда не удалит все элементы, поэтому я остановил его на разрыве 2, чтобы показать, почему он никогда не удалит все элементы. Я также порекомендовал, как это исправить. Это так же просто, как переместить блоки кода totalnumber в цикл while. Также посмотрите в array_sum.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню