Проблемы с циклом PHP - PullRequest
       6

Проблемы с циклом PHP

5 голосов
/ 08 июля 2010

Я в основном парень по CSS и HTML, но недавно я углубился в PHP.

Я не понимаю, почему этот скрипт зависает:

$loop_Until = 10;

while($i < $loop_Until)
{
    // do some code here
    $loop_Until = $loop_Until + 1;
}

Может кто-нибудь помочь, пожалуйста?

Ответы [ 4 ]

18 голосов
/ 08 июля 2010

Фиксированный код

$loop_Until = 10;
$i = 0;

    while($i < $loop_Until)
    {
        // do some code here
        $i = $i + 1;
    }

Объяснение вашего кода:

// A variable called loop until is set to 10
$loop_Until = 10;  

// While the variable i is less than 10
// NOTE:  i is not set in code snippet, so we have no way of knowing what value it is, if it is greater than 10 it might be infinite
while($i < $loop_Until)
{
    // Increment the 10 value up 1 every time, i never changes!
    $loop_Until = $loop_Until + 1;
}
11 голосов
/ 08 июля 2010

Это вызывает цикл ifinate, вам захочется взглянуть на цикл php for.http://php.net/manual/en/control-structures.for.php

for($i= 1; $i< $loop_Until; ++$i) {
    // do some code here
}

Вы увеличиваете $loop_Until каждый раз и никогда не увеличиваете $i, поэтому $i всегда будет меньше $loop_Until

1 голос
/ 08 июля 2010

Самое простое решение: замените "+" на "-" . Это приведет к завершению цикла. Как это:

$loop_Until = 10;

while($i < $loop_Until)
{
    // do some code here
    $loop_Until = $loop_Until - 1;
}

Позвольте мне объяснить, предложить немного лучшее решение и дать вам несколько альтернатив.

Если мы предположим, что $ i начинается меньше, чем $ loop_Until, то добавление 1 к $ loop_Until со строкой $loop_Until = $loop_Until + 1; никогда не приведет к тому, что $ i будет равно или больше, чем $ loop_Until.

Вы должны либо вычесть из $ loop_Until, либо добавить к $ i.

Вычесть 1 из переменной можно быстро, выполнив, --$variable. Добавление 1 к переменной можно быстро выполнить, набрав ++$variable, поэтому вы должны иметь:

$loop_Until = 10;

while($i < $loop_Until)
{
    // do some code here
    --$loop_Until;
}

Конечно, $ loop_Until звучит как то, что вы, возможно, захотите установить один раз, а затем оставить его неизменным. В этом случае вы можете установить $ i и увеличить его. Поэтому сначала установите для $ i все, что вы хотите (меньше, чем $ loop_Until, если вы хотите, чтобы цикл while выполнялся хотя бы один раз), а затем:

$loop_Until = 10;

while($i < $loop_Until)
{
    // do some code here
    ++$i;
}

Кстати, ++ $ i быстрее, чем $ i ++

Как упоминал Lizard, цикл for отлично подходит для этого. Два эквивалента для циклов для двух разделов кода выше

for($loop_Until = 10; $i < $loop_Until; --$loop_Until)
{
    // do some code here
}

и

for($loop_Until = 10; $i < $loop_Until; ++i)
{
    // do some code here
}

Просто убедитесь, что вы проверите, что ваше состояние в конечном итоге произойдет с несколькими цифрами на листе бумаги или в вашей голове.

Наконец, какое из этих решений вы выберете, будет зависеть от того, хотите ли вы, чтобы $ i или $ loop_Until оставались без изменений.

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

0 голосов
/ 08 июля 2010

while( 0 != ($loop_until--) );

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...