for
Aprenda o loop for em PHP: inicialização, condição e incremento, iteração de arrays, loops aninhados, loops infinitos e erros comuns.
O Loop for em PHP
for é o loop controlado por contador do PHP. Você o utiliza quando sabe — ou pode calcular — exatamente quantas vezes um bloco de código deve ser executado, como iterar de 0 até count($array) - 1, fazer contagem regressiva ou avançar por um intervalo. Esta página aborda as três partes do cabeçalho do loop, como cada uma é executada, como iterar arrays, loops infinitos e aninhados, a sintaxe alternativa com endfor, e os erros de "off-by-one" que pegam a maioria dos iniciantes.
Se você quiser percorrer todos os elementos de um array ou object sem gerenciar um índice, foreach costuma ser a melhor opção. Para um loop que executa até que uma condição se torne falsa, veja while. Uma comparação geral de todos os tipos de loop está em PHP Loops.
Sintaxe
for (initialization; condition; increment) {
// code to be executed on each pass
}O cabeçalho tem três expressões, separadas por ponto e vírgula:
| Expressão | Quando é executada | Uso típico |
|---|---|---|
initialization | Uma vez, antes do loop iniciar | Configurar um contador, ex: $i = 0 |
condition | Antes de cada iteração | O loop continua enquanto for verdadeiro |
increment | Após cada iteração | Avançar o contador, ex: $i++ |
A ordem de execução é: executar initialization, avaliar condition; se for verdadeira, executar o corpo, depois executar increment, depois reavalar condition, e assim por diante. No momento em que condition for falsa, o loop para e o corpo não é executado nessa última vez.
Um primeiro exemplo
<?php
for ($i = 1; $i <= 5; $i++) {
echo $i . PHP_EOL;
}
// Output:
// 1
// 2
// 3
// 4
// 5O contador começa em 1. Após imprimir 5, $i++ o torna 6, 6 <= 5 é falso e o loop termina — portanto, ele executa exatamente cinco vezes.
Iterando sobre um array
Um uso clássico do for é indexar um array. Armazene count() em uma variável (ou use o slot de incremento) para que o PHP não recontabilize o array a cada passagem:
<?php
$colors = ["red", "green", "blue"];
for ($i = 0, $n = count($colors); $i < $n; $i++) {
echo $colors[$i] . PHP_EOL;
}
// Output:
// red
// green
// blueNote que os índices de arrays começam em 0, então o último índice válido é count($colors) - 1. A condição usa < (não <=) exatamente por causa disso — usar <= aqui leria um elemento além do fim. Quando você só precisa dos valores e não do índice, prefira foreach, que evita toda essa classe de erros de "off-by-one".
Contagem regressiva e avanço por passos
A expressão de incremento é apenas código — ela pode decrementar ou avançar por qualquer quantidade:
<?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 10Múltiplas expressões e slots vazios
Cada um dos três slots pode conter várias expressões separadas por vírgula, e qualquer slot pode ser deixado vazio. Os ponto e vírgula são obrigatórios mesmo quando os slots estão em branco:
<?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 o slot de condição estiver vazio, ele é tratado como true, o que gera um loop infinito. Você então controla a saída de dentro do corpo com break:
<?php
$i = 0;
for (;;) {
if ($i >= 3) {
break;
}
echo $i . PHP_EOL;
$i++;
}
// Output:
// 0
// 1
// 2Use continue para pular o restante da iteração atual e ir direto para o passo de incremento.
Loops aninhados
Colocar um for dentro de outro permite trabalhar com grades, tabelas e padrões de multiplicação. Use nomes de contador distintos para cada nível:
<?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 9O loop interno completa todas as suas iterações para cada passagem única do loop externo.
Sintaxe alternativa com endfor
O PHP oferece uma forma com dois-pontos/endfor que é conveniente ao misturar loops com HTML em templates, pois evita chaves de fechamento soltas:
<?php for ($i = 1; $i <= 3; $i++): ?>
<p>Item <?= $i ?></p>
<?php endfor; ?>Isso renderiza três parágrafos <p>. A mesma sintaxe alternativa existe para foreach/endforeach.
Armadilhas comuns
- Erros de "off-by-one".
$i <= count($arr)lê um slot além do fim (aviso de índice indefinido); use$i < count($arr). - Modificar o tamanho do array dentro do loop. Se o corpo adicionar ou remover elementos, um
count()armazenado pode ficar desatualizado — verifique novamente ou mude paraforeach. - Loops infinitos acidentais. Esquecer o incremento, ou comparar na direção errada (ex:
$i--com$i < 10), significa que a condição nunca se tornará falsa. - Contadores de ponto flutuante. Avançar por
0.1acumula erros de arredondamento e pode ultrapassar o limite; faça o loop com inteiros e divida dentro do corpo.
Quando usar for
Escolha for quando a contagem de iterações é conhecida ou calculada antecipadamente e você genuinamente precisa do índice (contagens regressivas, repetição fixa, avanço por passos, construção de tabelas). Quando você simplesmente quer cada elemento de uma coleção, foreach é mais limpo e seguro. Quando o número de repetições depende de uma condição que muda dentro do loop, use while ou do...while.