2010-07-08 14 views
5

Sono principalmente un tipo CSS e HTML, ma recentemente mi sono cimentato in PHP.Problemi di PHP while loop

non riesco a capire perché questo script si blocca:

$loop_Until = 10; 

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

Qualcuno può aiutarmi?

+0

Qual è l'intervallo che ci si aspetta? –

risposta

11

Questo sta causando un ciclo ifinate, si vorrà dare un'occhiata al loop di php for. http://php.net/manual/en/control-structures.for.php

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

si stanno aumentando $loop_Until ogni volta e mai increaing $i quindi $i sarà sempre inferiore a $loop_Until

18

Codice Fisso

$loop_Until = 10; 
$i = 0; 

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

Spiegazione del codice:

// 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; 
} 
+3

+1 per usare il costrutto originale mentre invece di riscrivere come per. – dmp

+1

+1 per la spiegazione del suo codice iniziale - è sempre bene sapere in realtà PERCHE 'qualcosa non funziona come previsto. – user353297

+1

@danp: Questo è un vantaggio ... come? idio ha detto che in precedenza avevano usato solo HTML e CSS e forse non avevano saputo dei cicli 'for', che sono il costrutto corretto da utilizzare per il ciclo con un contatore. – Powerlord

1

Soluzione più semplice: sostituire il segno "+" con un "-". Ciò causerà la fine del ciclo. Così:

$loop_Until = 10; 

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

Lasciatemi spiegare, fornire una soluzione leggermente migliore e darvi alcune alternative.

Se assumiamo che $ i inizia come inferiore a $ loop_Until, quindi aggiungere 1 a $ loop_Until con la riga $loop_Until = $loop_Until + 1; non lo farebbe mai in modo che $ i sia uguale o maggiore di $ loop_Until.

È necessario sottrarre da $ loop_Until o aggiungere a $ i.

La sottrazione 1 da una variabile può essere eseguita rapidamente eseguendo, --$variable. L'aggiunta di 1 ad una variabile può essere fatto in fretta facendo, ++$variable, quindi si dovrebbe avere:

$loop_Until = 10; 

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

Naturalmente $ loop_Until suona come qualcosa che si potrebbe desiderare di impostare una volta, e poi lo hanno rimanere invariato. In questo caso, è possibile impostare $ i e incrementarlo. Quindi, prima impostare $ i per quello che vuoi (più piccolo di $ loop_Until, se si desidera che il ciclo while per eseguire almeno una volta), quindi:

$loop_Until = 10; 

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

Per inciso, ++$i is faster than $i++

Come accennato Lizard, il per il ciclo è ottimo per farlo. I due equivalente per i loop per le due sezioni di codice di cui sopra sono

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

e

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

Basta fare in modo di verificare che la vostra condizione finirà per accadere con un paio di numeri su un pezzo di carta o in la tua testa.

Infine, quale di queste soluzioni si sceglie dipenderà dal fatto che si desidera che $ i o $ loop_Until rimangano invariati.

Se si dispone di più loop e si desidera eseguire tutti la stessa quantità di volte, è probabilmente una buona idea mantenere $ loop_Until non modificato e reimpostare $ i all'inizio di ogni ciclo.

+0

'++ $ i vs $ i ++' è un ottimo esempio di micro-ottimizzazione. Whoa, sembra che tu abbia salvato interi 0,6 μs ogni volta che usi '++ $ i' invece di' $ i ++ '! –

+0

Sì. È una buona abitudine entrare. La leggibilità è equivalente, le sequenze di tasti sono equivalenti, ma fai una mini differenza, quindi potresti anche ... ti insegna anche la differenza tra i due, dal momento che non sono sempre intercambiabili (vedi la risposta di TheBoss) –

0

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

+1

Perché stai assumendo che 0 sia un numero di significati. OP vuole comparare a $ i .... anche, perché non mentre ($ loop_until--) se vuoi confrontare a 0. –

+0

'$ loop_until = 10/3;' –