for
Impara il ciclo for in PHP: inizializzazione, condizione e incremento, iterazione su array, cicli annidati, cicli infiniti e errori off-by-one.
Il ciclo for in PHP
for è il ciclo controllato da contatore di PHP. Si usa quando si sa — o si può calcolare — esattamente quante volte un blocco di codice deve essere eseguito, ad esempio iterando da 0 a count($array) - 1, contando al contrario o avanzando a intervalli. Questa pagina tratta le tre parti dell'intestazione del ciclo, come ciascuna viene eseguita, come iterare su array, cicli infiniti e annidati, la sintassi alternativa endfor, e gli errori off-by-one che colgono di sorpresa la maggior parte dei principianti.
Se invece vuoi scorrere ogni elemento di un array o oggetto senza gestire un indice, foreach è di solito lo strumento migliore. Per un ciclo che gira finché una condizione diventa falsa, vedi while. Un confronto di alto livello tra tutti i tipi di ciclo si trova in PHP Loops.
Sintassi
for (initialization; condition; increment) {
// code to be executed on each pass
}L'intestazione ha tre espressioni, separate da punti e virgola:
| Espressione | Quando viene eseguita | Uso tipico |
|---|---|---|
initialization | Una volta, prima dell'avvio del ciclo | Inizializzare un contatore, es. $i = 0 |
condition | Prima di ogni iterazione | Il ciclo continua finché è truthy |
increment | Dopo ogni iterazione | Avanzare il contatore, es. $i++ |
L'ordine di esecuzione è: eseguire initialization, valutare condition; se è vera, eseguire il corpo, poi eseguire increment, poi rivalutare condition, e così via. Nel momento in cui condition risulta falsa, il ciclo si ferma e il corpo non viene eseguito quell'ultima volta.
Un primo esempio
<?php
for ($i = 1; $i <= 5; $i++) {
echo $i . PHP_EOL;
}
// Output:
// 1
// 2
// 3
// 4
// 5Il contatore parte da 1. Dopo aver stampato 5, $i++ lo porta a 6, 6 <= 5 è falso e il ciclo termina — quindi viene eseguito esattamente cinque volte.
Iterare su un array
Un uso classico di for è l'accesso indicizzato a un array. Salva count() in una variabile (o usa lo slot di incremento) in modo che PHP non ricalcoli la lunghezza dell'array ad ogni passaggio:
<?php
$colors = ["red", "green", "blue"];
for ($i = 0, $n = count($colors); $i < $n; $i++) {
echo $colors[$i] . PHP_EOL;
}
// Output:
// red
// green
// blueNota che gli indici dell'array partono da 0, quindi l'ultimo indice valido è count($colors) - 1. La condizione usa < (non <=) proprio per questo motivo — usare <= qui leggerebbe un elemento oltre la fine. Quando hai bisogno solo dei valori e non dell'indice, preferisci foreach, che evita tutta questa classe di errori off-by-one.
Contare al contrario e avanzare a intervalli
L'espressione di incremento è semplice codice — può decrementare o saltare di qualsiasi quantità:
<?php
// Count down
for ($i = 5; $i >= 1; $i--) {
echo $i . " ";
}
echo PHP_EOL;
// Output: 5 4 3 2 1
// Step by 2 (even numbers only)
for ($i = 0; $i <= 10; $i += 2) {
echo $i . " ";
}
// Output: 0 2 4 6 8 10Espressioni multiple e slot vuoti
Ciascuno dei tre slot può contenere più espressioni separate da virgola, e qualsiasi slot può essere lasciato vuoto. I punti e virgola sono obbligatori anche quando gli slot sono vuoti:
<?php
// Two counters moving toward each other
for ($i = 0, $j = 10; $i < $j; $i++, $j--) {
echo "$i-$j" . PHP_EOL;
}
// Output:
// 0-10
// 1-9
// 2-8
// 3-7
// 4-6Se lo slot della condizione è vuoto viene trattato come true, il che produce un ciclo infinito. Puoi quindi controllare l'uscita dall'interno del corpo con break:
<?php
$i = 0;
for (;;) {
if ($i >= 3) {
break;
}
echo $i . PHP_EOL;
$i++;
}
// Output:
// 0
// 1
// 2Usa continue per saltare il resto dell'iterazione corrente e passare direttamente al passo di incremento.
Cicli annidati
Inserire un for all'interno di un altro permette di lavorare con griglie, tabelle e pattern moltiplicativi. Usa nomi di contatori distinti per ogni livello:
<?php
for ($row = 1; $row <= 3; $row++) {
for ($col = 1; $col <= 3; $col++) {
echo ($row * $col) . "\t";
}
echo PHP_EOL;
}
// Output:
// 1 2 3
// 2 4 6
// 3 6 9Il ciclo interno completa tutte le sue iterazioni per ogni singolo passaggio del ciclo esterno.
Sintassi alternativa endfor
PHP offre una forma con i due punti/endfor che è comoda quando si mescolano cicli con HTML nei template, perché evita parentesi graffe di chiusura sparse:
<?php for ($i = 1; $i <= 3; $i++): ?>
<p>Item <?= $i ?></p>
<?php endfor; ?>Questo produce tre paragrafi <p>. La stessa sintassi alternativa esiste per foreach/endforeach.
Errori comuni
- Errori off-by-one.
$i <= count($arr)legge uno slot oltre la fine (un avviso di indice non definito); usa$i < count($arr). - Modifica della lunghezza dell'array all'interno del ciclo. Se il corpo aggiunge o rimuove elementi, un
count()memorizzato può diventare obsoleto — riverifica, oppure passa aforeach. - Cicli infiniti accidentali. Dimenticare l'incremento, o confrontare nella direzione sbagliata (es.
$i--con$i < 10), significa che la condizione non diventa mai falsa. - Contatori in virgola mobile. Avanzare di
0.1accumula errori di arrotondamento e può superare il limite; usa cicli con interi e dividi all'interno del corpo.
Quando usare for
Usa for quando il numero di iterazioni è noto o calcolato in anticipo e hai effettivamente bisogno dell'indice (conteggi alla rovescia, ripetizione fissa, avanzamento a intervalli, costruzione di tabelle). Quando vuoi semplicemente ogni elemento di una collezione, foreach è più chiaro e sicuro. Quando il numero di ripetizioni dipende da una condizione che cambia all'interno del ciclo, usa while o do...while.