W3docs

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:

EspressioneQuando viene eseguitaUso tipico
initializationUna volta, prima dell'avvio del cicloInizializzare un contatore, es. $i = 0
conditionPrima di ogni iterazioneIl ciclo continua finché è truthy
incrementDopo ogni iterazioneAvanzare 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
// 5

Il 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.

"Provalo tu stesso" non è disponibile per questo esempio.

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
// blue

Nota 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 10

Espressioni 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-6

Se 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
// 2

Usa 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	9

Il 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 a foreach.
  • 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.1 accumula 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.

Esercitazione

Pratica
Qual è l'uso del ciclo 'for' in PHP?
Qual è l'uso del ciclo 'for' in PHP?
Was this page helpful?