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);

WT...

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.

Okay!

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é!