PHP para Iniciantes: Estruturas de Controle - FOR
My name is Kaique Garcia, but you can call me Kiko. I'm a developer since 2014, a guitar player since 2008, a World Wide Web explorer since 2000 and a living guy since 1992 (haha). My hobby is to have hobbies (I can tell you more than 20 hobbies I got from my childhood). My pleasure is to solve problems, that's the way I came to the development area. Ok, lemme finish it... I like to meet people, so don't worry about speaking to me!
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é!