Lezioni di PHP - Lezione 12 - Cicli while, foreach e for.
Molto spesso, sia nella programmazione che nella vita reale, dobbiamo eseguire azioni ripetitive finché non otteniamo il risultato desiderato. Nella vita quotidiana lo chiamiamo “fatica”, nella programmazione — cicli (loops). I cicli si incontrano frequentemente in PHP, poiché rappresentano un modo comodo per scorrere array, calcolare funzioni e molto altro. Iniziamo dal più semplice e più comune — while.
Cicli while in PHP
Il ciclo while è molto semplice: tra le parentesi tonde scriviamo la condizione, tra le parentesi graffe ciò che deve essere eseguito finché la condizione è vera. La condizione è un’espressione logica che può avere due stati: TRUE o FALSE. Se vuoi ripassare le espressioni logiche, consulta la lezione sull’operatore if
. Ecco un esempio di ciclo while:
<?php $counter = 5; $newArray = array(); while($counter > 2){ $newArray[]= $counter; $counter--; } print_r($newArray); ?>
Il risultato sarĂ un array con gli elementi 5, 4 e 3. Vediamo passo per passo cosa accade:
1° passo. $counter = 5 (5 > 2)
2° passo. $counter = 4 (4 > 2)
3° passo. $counter = 3 (3 > 2)
4° passo. $counter = 2 (2 = 2, la condizione non è più vera, quindi il ciclo si interrompe e 2 non viene inserito nell’array)
Un altro esempio: calcoliamo la tabella della funzione y(x) = 2x - 1.
<?php // funzione y(x) = 2x -1; $x = -10; while($x <= 10){ $y = 2*$x-1; print 'y(' . $x . ')=' . $y . '<br />'; $x++; } ?>
Il risultato mostrerĂ in colonna i valori della funzione per x da -10 a 10.
Questo è un diagramma di flusso del ciclo while. Mostra come funziona: abbiamo una condizione e un corpo del ciclo. Finché la condizione è vera, il corpo del ciclo viene eseguito; quando diventa falsa, PHP passa all’istruzione successiva.
Un punto MOLTO importante: se rimuovi la linea $x++;
— che aggiorna il contatore affinché la condizione smetta di essere vera — cosa succede se la condizione rimane sempre vera?
<?php // funzione y(x) = 2x -1; $x = -10; while($x <= 10){ $y = 2*$x-1; print 'y(' . $x . ')=' . $y . '<br />'; // $x++; } ?>
Allora sarà un grosso problema! Si verificherà un errore critico: il corpo del ciclo verrà eseguito all’infinito. Questa situazione si chiama loop infinito (o “blocco”). Evita sempre queste situazioni, perché possono causare il blocco o l’arresto del tuo sito!
Cicli foreach in PHP
Un altro ciclo fondamentale è foreach, che viene usato per scorrere gli array. “Scorrere” significa prendere ogni elemento dell’array, eseguire un’azione su di esso, poi passare al successivo e così via fino alla fine.
Facciamo un esempio: supponiamo di avere dieci elementi, “rosso” e “blu”. Contiamo quanti elementi rossi ci sono:
<?php $counter = 0; $newArray =array( 1=>'rosso', 2=>'blu', 3=>'blu', 4=>'rosso', 5=>'rosso', 6=>'blu', 7=>'rosso', 8=>'blu', 9=>'rosso', 10=>'blu', ); foreach($newArray as $key){ if($key == 'rosso'){ $counter++; } } print 'Abbiamo ' . $counter . ' elementi rossi'; ?>
Penso che questo semplice esempio sia chiaro. L’operatore as
serve per scorrere gli elementi uno per uno. Quando gli elementi finiscono, il ciclo foreach
termina.
Non tutti gli array, però, sono così semplici. A volte contengono sotto-array (array annidati). Anche questi possono essere attraversati con un ciclo foreach
annidato:
<?php $counter = 0; $newArray = array( 1=>array( 1 => 'rosso', 2 => 'blu', 3 => 'blu', ), 2=>array( 1 => 'rosso', 2 => 'rosso', 3 => 'blu', ) ); foreach($newArray as $key){ foreach($key as $element){ if($element == 'rosso'){ $counter++; } } } print 'Abbiamo ' . $counter . ' elementi rossi'; ?>
Ora dovresti avere un’idea abbastanza chiara di come funziona foreach. Lo incontreremo ancora molte volte nei prossimi esempi.
Ciclo for
Il ciclo for è simile a while, ma di solito viene usato quando il numero di iterazioni è noto in anticipo — ad esempio, 10 o 100 ripetizioni:
for($i=0;$i<10;$i++){ // dieci ripetizioni }
Vediamo ora di cosa è composto un ciclo for
:
for(){ }
Come per gli altri cicli, tutti i parametri vengono scritti tra parentesi tonde. Normalmente si usano tre parametri:
- $i=0 — inizializzazione del contatore, la variabile che memorizza il numero dell’attuale iterazione.
- $i<10 — la condizione che determina quando il ciclo deve continuare.
- $i++ — incremento del contatore di una unità per passare all’iterazione successiva.