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

<center> ![WT...](https://media.giphy.com/media/b4P7YIIC9nqqQ/giphy.gif) </center>

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
<?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
<?php

for($contador = 1; $contador <= 10; $contador++) {
    echo $contador . PHP_EOL;
}
```

Ou se você quer de 10 até 1:

```php
<?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
<?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`.

<center> ![Okay!](https://media.giphy.com/media/3o7abKhOpu0NwenH3O/giphy.gif) </center>

> Kiko, essa estrutura tem a sintaxe *procedural*?

**Sim!** Sua palavra reservada é o `for`, então a sintaxe é na mesma pegada:

```php
<?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](https://blog.kaiquegarcia.dev/php-para-iniciantes-tipos-de-dados-primitivos-iteraveis). Aguenta aí que jaja eu escrevo!

**Inté!**
