Loops: for, while, foreach e do-while
1. Introdução aos Loops em PHP
Loops são estruturas de controle fundamentais na programação que permitem executar um bloco de código repetidamente enquanto uma condição específica for verdadeira. Em PHP, existem quatro tipos principais de loops: for, while, do-while e foreach. Cada um possui características e casos de uso específicos que os tornam mais adequados para diferentes situações.
Antes de mergulharmos nos detalhes, é crucial entender dois cuidados básicos: loops infinitos (quando a condição de parada nunca é atingida) podem travar seu servidor, e loops mal otimizados podem degradar seriamente o desempenho da aplicação. Sempre verifique se suas condições de término estão corretamente definidas.
2. O Loop for
O loop for é ideal quando você sabe exatamente quantas vezes deseja repetir uma operação. Sua sintaxe completa inclui três expressões: inicialização, condição e incremento.
// Contagem progressiva de 1 a 10
for ($i = 1; $i <= 10; $i++) {
echo "$i ";
}
// Saída: 1 2 3 4 5 6 7 8 9 10
// Contagem regressiva de 10 a 1
for ($i = 10; $i >= 1; $i--) {
echo "$i ";
}
// Saída: 10 9 8 7 6 5 4 3 2 1
O for aninhado é particularmente útil para percorrer estruturas bidimensionais, como matrizes:
$matriz = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
for ($linha = 0; $linha < 3; $linha++) {
for ($coluna = 0; $coluna < 3; $coluna++) {
echo $matriz[$linha][$coluna] . " ";
}
echo "\n";
}
// Saída:
// 1 2 3
// 4 5 6
// 7 8 9
3. O Loop while
O loop while é mais flexível que o for e é utilizado quando o número de iterações não é conhecido antecipadamente. Ele executa o bloco de código enquanto a condição especificada for verdadeira.
// Processamento de dados até encontrar um valor específico
$numeros = [3, 7, 2, 9, 5, 1, 8];
$indice = 0;
$encontrado = false;
while ($indice < count($numeros) && !$encontrado) {
echo "Verificando: {$numeros[$indice]}\n";
if ($numeros[$indice] == 5) {
$encontrado = true;
echo "Valor 5 encontrado!\n";
}
$indice++;
}
Casos comuns para usar while incluem leitura de arquivos linha por linha, processamento de resultados de banco de dados e validações que dependem de entrada do usuário:
// Leitura de arquivo até o final
$arquivo = fopen("dados.txt", "r");
while (!feof($arquivo)) {
$linha = fgets($arquivo);
if ($linha !== false) {
echo "Linha: " . trim($linha) . "\n";
}
}
fclose($arquivo);
4. O Loop do-while
A principal diferença do do-while para o while é que ele garante a execução do bloco de código pelo menos uma vez, pois a condição é verificada após a primeira iteração.
// Comparação entre while e do-while
$contador = 10;
echo "Loop while:\n";
while ($contador < 5) {
echo "Este código nunca será executado\n";
}
echo "Loop do-while:\n";
do {
echo "Este código executa ao menos uma vez\n";
} while ($contador < 5);
Um caso prático é a implementação de menus interativos ou validação de entrada do usuário:
$opcao = 0;
do {
echo "\n--- MENU PRINCIPAL ---\n";
echo "1. Cadastrar usuário\n";
echo "2. Listar usuários\n";
echo "3. Sair\n";
echo "Escolha uma opção: ";
$opcao = (int) fgets(STDIN);
switch ($opcao) {
case 1:
echo "Opção 1 selecionada\n";
break;
case 2:
echo "Opção 2 selecionada\n";
break;
case 3:
echo "Saindo...\n";
break;
default:
echo "Opção inválida!\n";
}
} while ($opcao != 3);
5. O Loop foreach
O foreach é a maneira mais elegante e segura de percorrer arrays em PHP, funcionando perfeitamente tanto com arrays indexados quanto associativos.
// Iteração sobre array indexado
$frutas = ["Maçã", "Banana", "Laranja", "Uva"];
foreach ($frutas as $fruta) {
echo "$fruta ";
}
// Saída: Maçã Banana Laranja Uva
// Iteração sobre array associativo
$aluno = [
"nome" => "João",
"idade" => 20,
"curso" => "PHP"
];
foreach ($aluno as $chave => $valor) {
echo "$chave: $valor\n";
}
// Saída:
// nome: João
// idade: 20
// curso: PHP
O foreach também lida muito bem com arrays multidimensionais:
$turma = [
["nome" => "Ana", "nota" => 8.5],
["nome" => "Pedro", "nota" => 7.0],
["nome" => "Maria", "nota" => 9.2]
];
foreach ($turma as $aluno) {
echo "Aluno: {$aluno['nome']} - Nota: {$aluno['nota']}\n";
}
6. Controle de Fluxo Dentro de Loops
PHP oferece duas palavras-chave poderosas para controlar o fluxo dentro de loops: break e continue.
// break: interrompe o loop prematuramente
$numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
foreach ($numeros as $num) {
if ($num == 5) {
echo "Parando no número $num\n";
break;
}
echo "$num ";
}
// Saída: 1 2 3 4 Parando no número 5
// continue: pula iterações específicas
foreach ($numeros as $num) {
if ($num % 2 == 0) {
continue; // Pula números pares
}
echo "$num ";
}
// Saída: 1 3 5 7 9
// break com níveis para loops aninhados
for ($i = 0; $i < 3; $i++) {
for ($j = 0; $j < 3; $j++) {
if ($i == 1 && $j == 1) {
echo "Interrompendo ambos os loops\n";
break 2; // Sai dos dois loops
}
echo "($i, $j) ";
}
echo "\n";
}
// Saída:
// (0, 0) (0, 1) (0, 2)
// (1, 0) Interrompendo ambos os loops
7. Boas Práticas e Armadilhas Comuns
Evitando loops infinitos: Sempre certifique-se de que a condição de parada será eventualmente atingida. Um erro comum é esquecer de incrementar o contador:
// ERRADO: loop infinito
$i = 0;
// while ($i < 10) {
// echo $i; // Esqueceu de incrementar $i++
// }
// CORRETO
$i = 0;
while ($i < 10) {
echo $i;
$i++;
}
Performance: Para arrays grandes, o foreach geralmente é mais rápido que o for, pois não precisa gerenciar manualmente o índice:
// foreach é preferível para arrays
$grandeArray = range(1, 1000000);
$inicio = microtime(true);
// Mais rápido
foreach ($grandeArray as $valor) {
// processar $valor
}
// Mais lento
for ($i = 0; $i < count($grandeArray); $i++) {
// processar $grandeArray[$i]
}
Cuidado com referências no foreach: Modificar o array original durante a iteração com referência pode causar comportamentos inesperados:
$numeros = [1, 2, 3, 4, 5];
// Modificação segura (sem referência)
foreach ($numeros as &$valor) {
$valor *= 2;
}
unset($valor); // Importante: remover a referência após o loop
// Perigo: $valor ainda referencia o último elemento
echo $valor; // Pode causar bugs sutis
Dica importante: Sempre use unset() para remover a referência após um foreach com &$valor, evitando efeitos colaterais em operações subsequentes.
Lembre-se: escolher o loop correto para cada situação não apenas torna seu código mais legível, mas também mais eficiente. Pratique cada tipo de loop com diferentes cenários para internalizar quando usar cada um deles.
Referências
- PHP: for - Manual oficial — Documentação completa do loop for com exemplos e explicações detalhadas
- PHP: while - Manual oficial — Guia oficial sobre o loop while, incluindo sintaxe e casos de uso
- PHP: do-while - Manual oficial — Documentação do loop do-while com exemplos comparativos
- PHP: foreach - Manual oficial — Referência completa sobre o loop foreach, incluindo arrays e objetos
- PHP: break - Manual oficial — Documentação sobre a instrução break e seus níveis em loops aninhados
- PHP: continue - Manual oficial — Guia oficial sobre a instrução continue e seu uso em diferentes tipos de loops
- W3Schools PHP Loops — Tutorial prático com exemplos interativos dos quatro tipos de loops em PHP
- PHP The Right Way: Loops — Boas práticas e recomendações sobre o uso de loops em PHP