Fala, pessoal!

Andei meio sumido, mas voltei com a série de tutoriais.

Neste post vamos dar continuidade as estruturas de controle de fluxo no PHP, falaremos sobre laços de repetição no PHP, estas estruturas são responsáveis por realizar operações repetidamente em nosso código (loops), percorrer conjunto de registros vindos do banco de dados, por exemplo. Em PHP temos 4 laços de repetição, sendo eles while, do… while, for e foreach.

Mas antes vamos as sugestões de código para solução dos desafios do post anterior.

Número par ou ímpar: https://gist.github.com/RodriAndreotti/fd7534694fd74d2eacdf4b21cc130511

Número primo: https://gist.github.com/RodriAndreotti/5110404cf8db3ff3646e66bee4fbc63e  (Neste exemplo foi usado o laço for, o qual veremos neste post)

Abaixo veremos como funciona cada um destes laços e alguns exemplos de uso dos mesmos.

 

WHILE

O Funcionamento do while é semelhante ao funcionamento do IF, a diferença é que a estrutura de controle while executa determinada ação ENQUANTO (e esta é a palavra chave) determinada condição for verdadeira, a partir do momento que a condição informada for falsa o laço é abandonado e o código após ele é executado.

Para nosso exemplo utilizaremos o seguinte cenário:

Precisamos criar um diretório único no nosso servidor para armazenar arquivos, cada usuário do nosso sistema terá seu diretório no servidor e não terá acesso a pasta de terceiros, sendo assim, a rotina que criará o diretório deve verificar se o diretório existe, e se existir deve alterar o nome do diretório e tentar criar novamente o mesmo.

Vamos ao código:

No código acima o nome é gerado com o comando uniqid, teoricamente cada vez que é executado este comando gera um código único, porém já tive problemas com ele quando o código era executado no mesmo microsegundo, ou seja, ele gerou id repetido, então verificamos se já existe algum diretório com o mesmo nome, se existir algum diretório com o mesmo nome, o código dentro do while é executado e repetido até que o php não encontre nenhum diretório com o nome  gerado, obedecido este critério, o laço é abandonado e a execução do restante do código realizada.

 

Outro cenário onde é possível o uso do while é quando precisamos percorrer os registros de uma tabela em nosso banco de dados, o trecho de código abaixo ilustra isso.

No exemplo acima, utilizamos o operador de associação “=” ao invés de utilizarmos o operador lógico “==”, pois neste caso não queremos verificar se $result é igual a $stmt->fetch, e sim queremos que o que o método fetch nos retorna seja disponibilizado na variável $result, ainda analisando o código acima, o método fetch do pdo nos devolve um registro completo do banco de dados (linha da tabela) e move o ponteiro (que indica ao banco de dados qual linha deve nos mostrar) do banco para o próximo registro, então quando a tabela informada não tiver registros, ou quando o ponteiro estiver em uma posição onde não exista um registro válido, o método nos devolverá false, o que, por consequência, interromperá o laço while.

 

Por enquanto não nos preocupemos com o PDO do código acima, iremos abordar ele de forma ampla mais adiante. Neste primeiro momento o importante é compreendermos o funcionamento do while.

 

Quando o comando while for utilizado para gerar saída html é mais recomendado utilizarmos a sintaxe alternativa do mesmo, de modo a tornar o código mais claro, esta sintaxe alternativa é bem similar a do IF:

No manual do PHP, presente neste link, podemos ver mais exemplos fornecidos tanto pelos desenvolvedores quando pela comunidade para o comando, vale a pena dar uma lida nos comentários também.

DO WHILE

Trabalha de forma semelhante ao WHILE com a diferença que o bloco desta estrutura de controle sempre será executado, pelo menos uma vez, enquanto que o while só será executado se a condição informada for satisfeita.

Podemos reescrever o código do primeiro exemplo usado no while utilizando o do while

Podemos notar que o código faz exatamente a mesma coisa, porém como utilizamos o do while podemos eliminar a inicialização da variável fora do bloco, e gerar o primeiro uniqid dentro do do while diretamente, podemos notar também que o do while deve terminar com um ; (ponto e vírgula), visto que ele está após o bloco de {}.

 

O segundo exemplo do while não funcionaria no do while, visto que ele tentaria exibir o $result antes deste receber qualquer valor, pois a associação ocorre dentro do while,.

Neste momento vale uma observação, mais importante que conhecer a sintaxe destes comandos é importante que exercitemos a mente para que saibamos quando um é mais adequado e quando o outro é.

Voltando ao exemplo do diretório, veja que no código usando o do while, ele ficou menor, portanto mais fácil de ler, é sempre importante reduzirmos a complexidade de nosso código o máximo o possível, para garantir um código fácil de ser mantido.

Como a sintaxe do comando do while apresenta comando de abertura e comando de enceramento (do { … } while()) ele não possui uma sintaxe alternativa como os anteriores, pois é fácil identificar onde o comando se inicia e onde ele é finalizado.

Também podemos encontrar bons exemplos no manual do comando disponível neste link.

FOR

A estrutura de controle de fluxo for, assim com os dois anteriores é um loop, sendo assim ele vai executar um bloco de código repetidas vezes até determinada condição ser atendida, porém neste caso a inicialização do bloco é um pouco diferente do while, enquanto no while somente informávamos a condição de parada, no for nós inicializamos a variável também, é muito interessante quando nós queremos executar o bloco uma determinada quantidade de vezes, para isso o for utiliza uma variável de controle, que comumente recebe um nome com uma única letra (não é regra, somente uma prática comum).

Para nosso exemplo usaremos o seguinte cenário:

Precisamos validar o DV (Dígito Verificador) de uma conta bancária, utilizaremos como exemplo uma conta bancária qualquer, cujo DV é calculado utilizando-se o algoritmo de módulo 11, tomemos como exemplo o número de conta 123456-8, precisamos saber se este DV é válido, a rotina de cálculo do módulo de 11 é a seguinte:

  • Percorre-se o número da conta de trás para frente (no nosso caso do 6 ao 1)
  • Cada número é multiplicado por um peso, iniciando-se por 2
  • O resultado da multiplicação acima é somado a uma variável que acumula a soma de tudo.
  • Finalmente obtemos o módulo da soma por 11, e subtraímos o resultado de 11.
  • Se o resultado (11-resto da divisão) for igual a 10 o DV deve ser X, se for 11 o DV será 0 e qualquer outro valor, o DV será o próprio valor.

Atenção: esta é uma rotina genérica, apesar de ser semelhante em todos os bancos, cada banco insere ou retira informação no número da conta para compor o DV, para saber ao certo qual rotina seu banco utiliza, consulte a documentação fornecida pelo próprio banco.

Vamos ao código:

No código acima notamos a sintaxe do comando for, ele recebe três parâmetros, sendo eles:

  • Inicialização: Inicializa uma ou várias variáveis que serão utilizadas no bloco do comando, normalmente se utiliza com uma variável somente, porém se for necessário podemos inicializar várias variáveis separando-as por vírgula, no nosso caso inicializamos a variável $i com o tamanho da string (strlen) $numeroConta subtraído de 1, que nada mais é do que o trecho do número da conta que vem antes do “-“. Neste caso foi necessário subtrairmos 1 do strlen pois iríamos trabalhar com a string acessando cada caractere individualmente através de seu índice, que se inicia em 0, e iniciando em 0 seu último índice disponível é um número abaixo do seu tamanho (por exemplo, tamanho = 10, último índice = 9)
  • Condição de parada: É a condição que deve ser obedecida para que a execução do loop seja executada, no nosso exemplo, a condição é $i >= 0, ou seja, enquanto nossa variável $i for maior ou igual a 0 o bloco interno ao for será executado.
  • Incremento: A forma como a variável será alterada, seja para mais ou para menos, pode-se utilizar quaisquer dos operadores aritméticos que já vimos nestes post, os mais comuns são ++ e, mas poderia ser +=, -=, *= e /= também.

 

Assim como o while, recomenda-se o uso do for, quando este for gerar saída html (para popular uma tabela, por exemplo), com a sintaxe alternativa, ou seja, usando-se for(): … endfor;

Para mais exemplos recomendo a leitura do manual do PHP na seção do for, neste link.

 

FOREACH

O foreach é uma espécie de for abreviado, ele é utilizado quando desejamos interagir diretamente com arrays e objetos, caso a variável informada em seu parâmetro não exista ou exista, mas seja de um tipo de dados incompatível, o foreach lançará um erro.

A sintaxe do foreach é mais simples que a do for, como exemplo vamos usar um array qualquer (veremos mais sobre isso no post sobre arrays):

No exemplo acima nós percorremos o array $valores e mostramos os itens dele.

 

Adicionalmente podemos obter também o índice do item do array na execução do comando, como mostra o exemplo abaixo:

No código acima temos a variável $indice que receberá o valor do índice em cada iteração no array.

 

Assim como os demais laços que vimos, o foreach também possui a sintaxe alternativa utilizando “:” (dois pontos), que é recomendada para o uso quando este for gerar saída html.

Novamente, para mais exemplos recomendo a leitura do manual do PHP neste link.

 

Para os leitores iniciantes deixo dois desafios até o próximo post da série:

  • Desenvolva um código que crie a sequência de Fibonacci até o 10º elemento, para conferência dos valores utilize este link.
  • Desenvolva outro código que calcule o fatorial de 10, para conferência dos resultados pode-se utilizar este link.

Bom pessoal, ficamos por aqui, as soluções para o desafio estará no próximo post da série, se gostaram do post, compartilhem pode ser útil para mais alguém, se acha que faltou algo, deixe nos comentários.

Sobre Rodrigo Teixeira Andreotti

Técnico em Informática formado pela ETE Lauro Gomes Cursando atualmente o curso de Análise e Desenvolvimento de sistemas. Atuo como programador PHP há, pelo menos, 6 anos, sendo os dois últimos em empresas e os demais como Freelancer.


Also published on Medium.