Lezione 8 — Cicli in PHP: for, while e foreach

Scopri come automatizzare operazioni ripetitive in PHP utilizzando i cicli for, while e foreach. Guida completa con esempi pratici e best practice.

Introduzione ai Cicli in PHP

Nel mondo della programmazione, una delle operazioni più comuni e potenti è la capacità di ripetere un blocco di codice più volte senza doverlo riscrivere manualmente. Questa operazione è gestita dai cosiddetti cicli (o loop).

Immagina di dover stampare i numeri da 1 a 100, oppure di dover leggere ogni singola riga di un database per visualizzare l'elenco dei tuoi utenti. Scrivere 100 volte l'istruzione echo sarebbe inefficiente, prono a errori e impossibile da mantenere. I cicli risolvono questo problema permettendo al programma di iterare su un set di dati o di ripetere un'azione finché una determinata condizione rimane vera.

In PHP, disponiamo di diverse tipologie di cicli, ognuno progettato per scenari specifici. In questa lezione analizzeremo nel dettaglio il ciclo for, il ciclo while e il ciclo foreach, comprendendo non solo come funzionano, ma soprattutto quando scegliere l'uno rispetto all'altro.

Il Ciclo for: Controllo Preciso delle Iterazioni

Il ciclo for è l'ideale quando conosciamo a priori il numero esatto di volte che il blocco di codice deve essere eseguito. È un ciclo "contato", poiché si basa solitamente su un contatore numerico.

La Struttura del for

La sintassi del for è composta da tre parti fondamentali racchiuse tra parentesi tonde, separate da punti e virgola:

  1. Inizializzazione: Viene eseguita una sola volta all'inizio. Qui definiamo la variabile di controllo (il contatore).
  2. Condizione: Viene valutata prima di ogni iterazione. Se è true, il ciclo continua; se è false, il ciclo termina.
  3. Aggiornamento: Viene eseguito alla fine di ogni iterazione (solitamente per incrementare o decrementare il contatore).

Ecco un esempio completo e commentato:

<?php
// Esempio di ciclo for per stampare la tabellina del 5
$numero = 5;

echo "Tabellina del $numero:\
";

for ($i = 1; $i <= 10; $i++) {
    // $i parte da 1, il ciclo continua finché $i è minore o uguale a 10
    // Alla fine di ogni giro, $i aumenta di 1 ($i++)
    $risultato = $numero * $i;
    echo "$numero x $i = $risultato\
";
}
?>

In questo esempio, il ciclo è perfetto perché sappiamo esattamente che la tabellina ha 10 passaggi. Se cambiassimo la condizione in $i <= 20, il ciclo continuerebbe per altre 10 volte.

Il Ciclo while: Ripetizione Basata su Condizione

A differenza del for, il ciclo while (che letteralmente significa "mentre") viene utilizzato quando non sappiamo esattamente quante volte il codice dovrà essere eseguito, ma sappiamo che deve continuare finché una certa condizione è vera.

Come Funziona il while

Il while è più semplice nella sintassi: controlla solo la condizione. Se la condizione è vera all'inizio, il codice interno viene eseguito. Al termine del blocco, PHP torna a controllare la condizione. Se è ancora vera, riparte; altrimenti, esce.

Attenzione: Un errore comune con il while è dimenticare di aggiornare la variabile utilizzata nella condizione all'interno del corpo del ciclo. Questo crea un loop infinito, che può bloccare il server o causare il crash della pagina.

<?php
// Esempio di ciclo while per simulare un countdown
$countdown = 5;

while ($countdown > 0) {
    echo "Lancio tra $countdown...\
";
    
    // Fondamentale: decrementiamo la variabile per evitare un loop infinito
    $countdown--; 
}

echo "Decollo! 🚀";
?>

Differenza tra while e do-while

Esiste una variante chiamata do-while. La differenza fondamentale è che il while controlla la condizione prima di eseguire il codice, mentre il do-while esegue il codice almeno una volta e poi controlla la condizione.

<?php
$i = 10;

// Questo ciclo NON verrà mai eseguito perché 10 non è minore di 5
while ($i < 5) {
    echo "Questo non verrà stampato";
}

// Questo ciclo verrà eseguito UNA VOLTA, anche se la condizione è falsa
do {
    echo "Questo verrà stampato una volta nonostante la condizione";
} while ($i < 5);
?>

Il Ciclo foreach: L'Alleato degli Array

Il ciclo foreach è probabilmente il ciclo più utilizzato nello sviluppo web moderno con PHP. È progettato specificamente per iterare attraverso gli array (sia indicizzati che associativi) e gli oggetti.

Il vantaggio principale è che non abbiamo bisogno di gestire un contatore ($i) o di conoscere la lunghezza dell'array tramite la funzione count(). PHP si occupa automaticamente di scorrere tutti gli elementi dall'inizio alla fine.

Iterare su Array Indicizzati

Quando usiamo un array semplice, il foreach ci restituisce il valore di ogni elemento a ogni iterazione.

<?php
$frutti = ["Mela", "Banana", "Arancia", "Fragola"];

foreach ($frutti as $frutto) {
    echo "Mi piace mangiare la $frutto\
";
}
?>

Iterare su Array Associativi

Negli array associativi (dove abbiamo coppie chiave $
ightarrow$ valore), il foreach ci permette di recuperare entrambi i dati.

<?php
$utente = [
    "Nome" => "Mario",
    "Cognome" => "Rossi",
    "Email" => "mario.rossi@example.com",
    "Ruolo" => "Admin"
];

foreach ($utente as $chiave => $valore) {
    // $chiave conterrà 'Nome', 'Cognome', ecc.
    // $valore conterrà 'Mario', 'Rossi', ecc.
    echo "$chiave: $valore\
";
}
?>

Esempi Pratici e Casi d'Uso Reali

Per capire quale ciclo usare, guardiamo a tre scenari tipici di un sito web.

1. Generazione di un menu a tendina (HTML Select)

Se abbiamo un array di categorie, useremo foreach per generare le opzioni HTML.

<?php
$categorie = ["Elettronica", "Libri", "Abbigliamento", "Casa"];

echo '<select name="category">';
foreach ($categorie as $cat) {
    echo "<option value='" . strtolower($cat) . "'>$cat</option>";
}
echo '</select>';
?>

2. Creazione di una tabella di dati

Se dobbiamo creare una tabella con un numero fisso di righe (es. un calendario mensile), il ciclo for è la scelta migliore.

<?php
// Esempio semplificato: crea 5 righe di una tabella
echo '<table border="1">';
for ($r = 1; $r <= 5; $r++) {
    echo "<tr><td>Riga $r</td></tr>";
}
echo '</table>';
?>

3. Lettura di un file di testo

Quando leggiamo un file riga per riga, non sappiamo a priori quante righe ci siano. Useremo while insieme a una funzione di lettura come fgets().

<?php
$file = fopen("dati.txt", "r");

// Continua a leggere finché fgets non restituisce false (fine file)
while (($linea = fgets($file)) !== false) {
    echo "Contenuto riga: $linea";
}

fclose($file);
?>

Errori Comuni e FAQ

Perché il mio browser non carica la pagina? (Loop Infinito)

Se hai scritto un ciclo while o for e la pagina continua a caricare all'infinito finché non appare un errore di "Timeout", probabilmente hai creato un loop infinito.

Esempio di errore: for ($i = 0; $i >= 0; $i++) $
ightarrow$ Poiché $i parte da 0 e aumenta sempre, sarà sempre maggiore o uguale a 0. La condizione non diventerà mai false.

Posso interrompere un ciclo prima della fine?

Sì, PHP offre due istruzioni fondamentali per controllare il flusso dei cicli:

  • break: Interrompe completamente il ciclo e passa al codice successivo.
  • continue: Salta l'iterazione corrente e passa immediatamente a quella successiva.

Qual è il ciclo più veloce?

In termini di prestazioni pure, for e foreach sono estremamente efficienti in PHP. foreach è leggermente più lento in versioni vecchissime di PHP, ma nelle versioni moderne (PHP 7+ e 8+) la differenza è trascurabile. La scelta deve basarsi sulla leggibilità e sulla logica, non sulla micro-ottimizzazione.

Prossimi Passi

Ora che hai padroneggiato i cicli, sei in grado di gestire set di dati complessi. Per approfondire ulteriormente, ti suggeriamo di:

  1. Studiare le Funzioni di Array: Scopri funzioni come array_map() e array_filter(), che permettono di manipolare gli array in modo ancora più elegante rispetto ai cicli manuali.
  2. Esercitazione Pratica: Prova a creare un programma che stampi tutti i numeri primi tra 1 e 100 usando un ciclo for annidato (un ciclo dentro l'altro).
  3. Integrazione Database: Nella prossima lezione vedremo come usare il ciclo while per estrarre i risultati di una query SQL da un database MySQL.

Ricorda: la pratica è l'unico modo per rendere naturali questi concetti. Prova a scrivere piccoli script che automatizzino calcoli o formattazione di testi per consolidare quanto appreso!