I cicli sono un altro degli elementi fondamentali di qualsiasi linguaggio di programmazione, in quanto ci permettono di eseguire determinate operazioni in maniera ripetitiva. È una necessità che si presenta molto spesso: infatti non è raro che un programma o uno script debbano elaborare quantità anche molto grosse di dati; in questa situazione, si prevederà il trattamento da utilizzare per ogni singolo dato (o gruppo di dati correlati), che sarà poi ripetuto per tutte le ricorrenze di tali dati.
Ciclo For
Iniziamo subito con un esempio (come al solito abbastanza banale): supponiamo di voler mostrare i multipli da 1 a 10 di un numero, ad esempio 5. La prima soluzione è quella di usare il ciclofor
:
for ($mul = 1; $mul <= 10; ++$mul) { $ris = 5 * $mul; echo "5 * $mul = $ris "; }
for
,
seguita, fra parentesi, dalle istruzioni per definire il ciclo; di
seguito, si racchiudono fra parentesi graffe tutte le istruzioni che
devono essere eseguite ripetutamente. Le tre istruzioni inserite fra le
parentesi tonde e separate da punto e virgola vengono trattate in questo
modo: la prima viene eseguita una sola volta, all'inizio del ciclo; la terza viene eseguita alla fine di ogni iterazione del ciclo; la seconda
deve essere una condizione, e viene valutata prima di ogni iterazione
del ciclo: quando risulta falsa, l'esecuzione del ciclo viene
interrotta, ed il controllo passa alle istruzioni dopo le parentesi
graffe. Quando invece è vera, le istruzioni fra parentesi graffe vengono
eseguite. Ovviamente è possibile che tale condizione risulti falsa fin
dal primo test: in questo caso, le istruzioni contenute fra le parentesi
graffe non saranno eseguite nemmeno una volta.
Il formato standard è quindi quello che abbiamo visto sopra, che utilizza le parentesi tonde per definire un 'contatore': con la prima istruzione lo si inizializza, con la seconda lo si confronta con un valore limite oltre il quale il ciclo deve terminare, con la terza lo si incrementa dopo ogni esecuzione.
Con il ciclo
for
, così come con tutti gli altri cicli, è molto importante stare attenti a non creare una situazione in cui il ciclo non raggiunge mai una via d'uscita
(il cosiddetto 'loop'): in questo caso, infatti, lo script
rieseguirebbe il nostro ciclo all'infinito. Nel nostro esempio di prima
potrebbe succedere, ad esempio, se sbagliassimo a scrivere il nome della
variabile $mul
nell'istruzione di incremento: se avessimo scritto $mus++
, avremmo incrementato questa variabile, che non viene utilizzata nel ciclo, dopo ciascuna delle sue esecuzioni; in questo modo $mul
rimarrebbe sempre uguale ad 1, ed il nostro ciclo stamperebbe all'infinito "5 * 1 = 5", perchè $mul
non diventerebbe mai maggiore di 10.
In molte situazioni classiche di programmazione, un errore di questo genere potrebbe costringerci a forzare la chiusura del programma o addirittura a spegnere la macchina: nel caso di PHP, questo di solito non succede, in quanto gli script PHP hanno un limite di tempo per la loro esecuzione, oltre il quale si arrestano. Tale limite è normalmente di 30 secondi, ed è comunque impostabile attraverso il file
php.ini
.
Il ciclo While
Vediamo ora un altro tipo di ciclo, più semplice nella sua costruzione: il ciclowhile
. Questo si può considerare come una specie di if
ripetuta più volte: infatti la sua sintassi prevede che alla parola chiave while
segua, fra parentesi, la condizione da valutare, e fra parentesi
graffe, il codice da rieseguire fino a quando tale condizione rimane
vera. Vediamo con un esempio come ottenere lo stesso risultato
dell'esempio precedente:
$mul = 1; while ($mul <= 10) { $ris = 5 * $mul; print("5 * $mul = $ris "); $mul++; }
while
, rispetto al for
, non ci
mette a disposizione le istruzioni per inizializzare e per incrementare
il contatore: quindi dobbiamo inserire queste istruzioni nel flusso
generale del codice, per cui mettiamo l'inizializzazione prima del
ciclo, e l'incremento all'interno del ciclo stesso, in fondo. Anche in
questa situazione, comunque, il concetto fondamentale è che l'esecuzione
del ciclo termina quando la condizione fra parentesi non è più
verificata: ancora una volta, quindi, è possibile che il ciclo non sia
eseguito mai, nel caso in cui la condizione risulti falsa fin da subito.
Il ciclo do...while
Esiste invece un'altra forma, simile alwhile
, con la
quale possiamo assicurarci che il codice indicato tra le parentesi
graffe venga eseguito almeno una volta: si tratta del do...while
$mul = 11; do { $ris = 5 * $mul; print("5 * $mul = $ris "); $mul++; } while ($mul <= 10)
while
viene spostato dopo il
codice da ripetere, ad indicare che la valutazione della condizione
viene eseguita solo dopo l'esecuzione del codice fra parentesi graffe.
Nel caso del nostro esempio, abbiamo inizializzato la variabile $mul col
valore 11, per creare una situazione nella quale, con i cicli visti
prima, non avremmo ottenuto alcun output, mentre con l'uso del do...while
il codice viene eseguito una volta nonostante la condizione indicata
fra parentesi sia falsa fin dall'inizio. L'esempio stamperà quindi "5 *
11 = 55".
Uscire da un ciclo
Abbiamo visto che PHP termina l'esecuzione di un ciclo quando la condizione a cui è sottoposto non è più verificata. Abbiamo però a disposizione altri strumenti per modificare il comportamento del nostro script dall'interno del ciclo: infatti possiamo dire a PHP di non completare la presente iterazione e passare alla successiva (concontinue
) oppure di interrompere definitivamente l'esecuzione del ciclo (con break
). Vediamo un esempio:
for ($ind = 1; $ind < 500; $ind++) { if ($ind % 100 == 0) { break; }elseif ($ind % 25 == 0) { continue; } echo "valore: $ind "; }
$ind
corrisponde ad un
multiplo di 25 (infatti l'istruzione 'continue' fa sì che PHP salti la
'print' e passi direttamente all'iterazione successiva, incrementando la
variabile), e che il ciclo si interrompa del tutto quando $ind
raggiunge il valore 100.
Ciclo Foreach
Esiste un ultimo tipo di ciclo, ed è un ciclo particolare perchè è costruito appositamente per il trattamento degli array e di particolari oggetti chiamati Iteratori: si tratta delforeach
. Questo
ci permette di costruire un ciclo che viene ripetuto per ogni elemento
di una collezione passata come argomento. La sintassi è la seguente:
foreach ($arr as $chiave => $valore) {
}
$chiave
e $valore
,
l'indice e il contenuto dell'elemento che stiamo trattando. È da notare
che, nel caso ci interessi soltanto il valore e non la chiave (ad
esempio perchè le chiavi sono numeriche), possiamo anche evitare di
estrarre la chiave stessa:
foreach ($arr as $valore) {
}
0 commenti:
Posta un commento
Proponi un'idea, segnalaci un problema.
Entra a far parte di CS3, pubblica i tuoi articoli.
Scrivi un commento!