22 – 23 Ciclo FOR
Il ciclo for a differenza del while e del do while che sono indefiniti, cioè generalmente non si sa quante volte si ripeterà il blocco istruzioni se non mettendo un contatore, il for è utilizzato quando si sa a priori quante ripetizioni farà il blocco delle istruzioni. Infatti si dice che è un ciclo enumerativo.
for (espressione; condizione; espressione)
istruzione;
oppure con maggiori istruzioni:
for (espressione; condizione; espressione)
{
istruzione1;
istruzione2;
…
}
$cont=0; while ($cont<10) { echo "ciao"; $cont++; } for ($cont=0; $cont<10; $cont++) echo "ciao";
In questo esempio eseguiamo lo stesso ciclo prima col while, poi col for.
Il for esegue lo stesso codice su una riga: il primo valore, l’inizializzazione ($cont=0) viene eseguito solo la prima volta. Verifico la condizione ($cont<10), se è vera eseguo le istruzioni (echo “ciao”) e subito eseguo l’ultima espressione dentro al ciclo ($cont++). Se la condizione è falsa, termino il ciclo.
<html> <style> td {border: 1px solid red;} </style> <?php echo "<table>"; $nl="<br />"; for ($i=0; $i<10; $i++) echo "<tr> <td> riga n. $i </td> </td>\n"; echo "</table>"; ?> </html>
In questo ciclo for generiamo ad ogni ripetizione dei <td> e dei <tr> e il numero di riga.
Nel seguente esempio replichiamo la stessa cosa del precedente ma usiamo un indice (indice dell’array) per inserire i caratteri di una parola.
<html> <style> td {border: 1px solid red;} </style> <?php echo "<table>"; $nl="<br />"; $parola="FANTASTICO"; for ($i=0; $i<10; $i++) echo "<tr> <td> $parola[$i] </td> </td>\n"; echo "</table>"; ?> </html>
Il precedente esempio funziona solo se la stringa è lunga precisamente 10 caratteri, come in questo caso (FANTASTICO). Se invece vogliamo svincolarci da questo limite, basta usare una funzione (strlen) che calcola la lunghezza quindi la precedente condizione del ciclo diventa:
for ($i=0; $i<strlen( $parola); $i++)
Se la stringa fosse vuota, varrebbe 0 che non è minore di 0 quindi il ciclo non partirebbe e non genererebbe nessun errore.
Nel prossimo esempio, aggiungiamo un comando per contare le vocali.
<html> <style> td {border: 1px solid red;} </style> <?php echo "<table>"; $nl="<br />"; $parola="FANTASTICO"; for ($i=0, $contavocali=0; $i<strlen($parola); $i++) { echo "<tr> <td> $parola[$i] </td> </td>\n"; if ( strpos( "AEIOU", strtoupper( $parola[ $i ] ) ) !== false ) $contavocali ++; } echo "</table> $nl $contavocali"; ?> </html>
Per prima cosa notiamo che ho aggiunto un’ inizializzazione nel ciclo separandole dalla virgola ($i=0, $contavocali=0).
Nell’ if invece uso delle funzione specifiche per le stringhe. La prima da considerare è strtoupper che trasforma nel mio flusso di calcolo tutti i caratteri da cercare in maiuscolo.
Fatto questo uso strpos (posizione stringa) definendo una stringa obiettivo (AEIOU), nel ns caso l’insieme delle vocali. Quindi la prima lettera è la F, non rientra nell’obbiettivo quindi il risultato e FALSE.
La seconda lettera è la A rientra nell’obbiettivo in posizione 0 quindi diverso da FALSE, incrementa il contatore $contaVocali di 1. Attenzione che bisogna usare l’operatore logico diverso forte (!==) altrimenti la A che è in prima posizione nell’obbiettivo “AEIOU” varrebbe 0 e l’operatore debole != l’avrebbe considerato false.
La N e la T sono FALSE.
La I nel conteggio “AEIOU” è in terza posizione quindi vale 2, !== FALSE incrementa il contatore.
Oltre che la doppia inizializzazione, è possibile mettere la doppia espressione finale dentro al ciclo, sempre separata da virgola.
Nel prossimo esempio aggiungiamo un’altra inizializzazione e una doppia espressione finale per stampare la parola al contrario.
<html> <style> td {border: 1px solid red;} </style> <?php echo "<table>"; $nl="<br />"; $parola="FANTASTICO";for ($i=0, $contavocali=0, $j=strlen($parola)-1; $i<strlen($parola); $i++,$j--) { echo "<tr> <td> $parola[$i] $parola[$j]</td> </td>\n"; if ( strpos( "AEIOU", strtoupper( $parola[ $i ] ) ) !== false ) $contavocali ++; } echo "</table> $nl $contavocali"; ?> </html>
Notare l’operatore di decremento “$j—“. Quindi avremo le 3 inizializzazioni: $i=0, $contavocali=0, $j=strlen($parola)-1. La condizione: $i<strlen($parola). E le 2 espressioni finali: $i<strlen($parola); $i++,$j–.
Ultima particolarità è che nel for nessuna delle tre sintassi (inizializzazione; condizione, espressione) sono obbligatorie. In certi casi, dove magari abbiamo diverse istruzioni o calcoli complessi possiamo omettere la condizione e i ciclo andrebbe all’infinito. Ovviamente metteremo una condizione che lo interrompa:
$parola="FANTASTICO"; for ($i=0; ; $i++) { if ( $i > strlen( $parola ) ) break; }
Quindi se il ns contatore $i ha superato la lunghezza della stringa $parola esegue l’interruzione (break).
estremizzando il discorso, possiamo omettere tutti i valori del ciclo e quindi avere la forma più minimale:
$parola="FANTASTICO"; for (; ;) { }