PHP para Iniciantes: Estruturas de Controle - FOR
E enfim chegamos a uma das estruturas mais polêmicas dos coding dojos: FOR. Pra quem já lida com ela no dia-a-dia, a noção do que é já está bem clara na mente. Mas explicar isso é outro rolê, porque quase não tem a ver com a semântica.
* respira
O que vamos falar nesse artigo é sobre mais um laço de repetição que é de conhecimento obrigatório para todo desenvolvedor. Esse laço te dá um controle forte sobre repetições e pode fazer MUITA COISA. O problema é que as pessoas só pensam nele em ciclos exatos (repetir 5 vezes, repetir 10 vezes, etc). Enquanto isso, quem entende sua sintaxe sabe que ele pode ir além. Dá pra fazer a mesma coisa do while
e do-while
num for
tranquilamente, pois sua semântica simplificada é: PARA (isso) FAÇA (aquilo);
.
Mas dada as expressões necessárias para escrever um laço FOR
, a semântica que utilizamos, na prática, vira DADO (valores iniciais) ENQUANTO (issoForVerdade) FAÇA (aquelaAção) E DEPOIS (outraAçãoAntesDeValidarAVerdade);
Então NÃO, as implementações do FOR
não são tão simples de explicar. Você já deve imaginar que a escrita no PHP com certeza não usa palavras reservadas o suficiente para expressar toda essa semântica... E você está certo:
<?php
$condicaoAValidar = false; // criando apenas para expressar o local de cada coisa
for (
$valoresIniciais = 1, $outroValorInicial = 30, $maisUmValorInicial = ["um array com uma string!?"];
$condicaoAValidar || ($valoresIniciais < $outroValorInicial && !empty($maisUmValorInicial));
$umaAcaoParaRodarNoFimDoLoop = ++$valoresIniciais
) {
// ação
var_dump($valoresIniciais); // int(1)
var_dump($outroValorInicial); // int(30)
var_dump($maisUmValorInicial); // array("um array com uma string!?")
var_dump($umaAcaoParaRodarNoFimDoLoop); // null, porque não existe ainda!
$maisUmValorInicial = [];
}
var_dump($valoresIniciais); // int(2)
var_dump($outroValorInicial); // int(30)
var_dump($maisUmValorInicial); // array()
var_dump($umaAcaoParaRodarNoFimDoLoop); // int(2)
PEGADINHA PRA QUEM JÁ MANJA: quantas vezes o bloco de instruções dentro do for
vai ser acionado?
Ok, nem adianta esperar por uma resposta, não é mesmo? Que é: apenas uma vez.
A definição de um for
é isso mesmo:
for(inicializacao; condicao; acaoAntesDoProximoLoop) {
instrucoes;
}
E você pode incializar quantas variáveis precisar. Tudo o que você inicia em um for
existe fora dele (no escopo onde ele estiver inserido, no caso). Os valores que saem na terceira expressão também permanecem fora do for
, como pode ver no exemplo que fiz (a variável $umaAcaoParaRodarNoFimDoLoop
permaneceu "viva").
Então, se você quer contar de 1 até 10:
<?php
for($contador = 1; $contador <= 10; $contador++) {
echo $contador . PHP_EOL;
}
Ou se você quer de 10 até 1:
<?php
for($contador = 10; $contador >= 1; $contador--) {
echo $contador . PHP_EOL;
}
Ou ainda, se você quiser os primeiros 10 números pares a partir do número 150:
<?php
for($pares = [], $numeroAtual = 150; count($pares) < 10; $numeroAtual += 2) {
$pares[] = $numeroAtual;
}
var_dump($pares); // array(150, 152, 154, 156, 158, 160, 162, 164, 166, 168)
Enfim, para uma infinidade de aplicações, você vai poder usar a sintaxe for
sem criar nenhuma variável fora do escopo dela. Incrível? Eu acho. Ela só perde no assunto de iterações de listas... Nesse caso, eu prefiro a estrutura do nosso próximo artigo: foreach
.
Kiko, essa estrutura tem a sintaxe procedural?
Sim! Sua palavra reservada é o for
, então a sintaxe é na mesma pegada:
<?php
for($contador = 1; $contador <= 10; $contador++):
echo $contador . PHP_EOL;
endfor;
E por hoje é só!
Curtiu? Comenta e compartilha! Como já anunciei ali em cima, o próximo artigo será sobre FOREACH
, que é bem na pegada do FOR
mas sobre percorrer dados iteráveis. Aguenta aí que jaja eu escrevo!
Inté!