Aprender PHP

Assine o RSS

Laços de repetição while e do while no PHP

Criado em: 24/06/2010

Introdução

Quando for necessário efetuar a repetição de um trecho de um programa um determinado número de vezes o que você faria? Escreveria de novo? Copiaria e colaria? Bem feio né? Afinal estamos utilizando de maquinas que são feitas para trabalhar para nos e não o contrario. Quando encontrarmos um problema como o apresentado anteriormente temos os laços de repetição, também conhecidos como loopings ou laços malhas de repetição que poderão nos ajudar. Vamos a um problema para tentarmos resolver:

Problema

Bart Simpson ficou novamente na detenção no final da aula. E como punição terá que escrever: “Estou aprendendo loopings no Aprender PHP” 100 vezes no quadro, ou no nosso caso na tela.

Com o conhecimento que aprendemos até aqui faríamos algo como:

<?php

$mensagem = "Estou aprendendo loopings no Aprender PHP";

echo $mensagem . '<br />' . PHP_EOL ;
echo $mensagem . '<br />' . PHP_EOL ;
echo $mensagem . '<br />' . PHP_EOL ;

?>

Até repetirmos 100 vezes. O que não é muito inteligente né? Vamos conhecer agora a nossa primeira estrutura de repetição, o while.

O while no PHP

O while executa um teste lógico, que retorne verdadeiro ou falso, no inicio do looping para verificar se é permitido ou não executar as instruções. Traduzindo while para português obtemos “enquanto” sendo assim as instruções serão executadas enquanto o teste do looping for considerado verdadeiro.

A estrutura while tem seu funcionamento controlado por decisões podendo executar um determinado conjunto de instruções enquanto a condição for verdadeira (True) e no momento em que a condição for avaliada como falsa (False) o processamento da rotina é desviado para fora do looping. Se desde o inicio a condição for tratada como falsa o looping não será executado.

Diagrama de blocos

Observe como seria a representação do problema de Bart Simpson utilizando o while.

Diagrama de blocos do while no php

Não temos nenhum símbolo novo no nosso diagrama. Iniciamos com 2 blocos de processamento de dados, um para o criarmos a mensagem e outro para criar o contador, $i, saberá mais sobre o contador abaixo. Em seguida criamos um símbolo de decisão, o losango. Se contador for menor que 100 o bloco dentro do looping será executado que consiste em imprimir os dados na tela e incrementar em 1 o contador e voltar ao inicio do looping. Quando o contador for maior que 100 encerrasse o looping.

No PHP

Observe como ficaria a representação em PHP da nossa estrutura while para resolver o problema de Bart Simpson. E como Bart demorou muito ele ainda teve que numerar para termos certeza que ele escreveu às 100 vezes. Observe o código:

<?php

$mensagem = "Estou aprendendo loopings no Aprender PHP";

$i = 1;
while( $i <= 100 ){
  echo $i . ' - ' .$mensagem . '<br />' . PHP_EOL ;
  $i++;
}

?>

Iniciamos atribuindo um valor a variável mensagem em seguida criamos uma variável $i que é conhecida como contador ou sentinela. Logo abaixo de nosso contador iniciamos o while que avalia se $i é menor que 100, se for verdadeiro ele executa a instrução se não ele sai do looping. A primeira volta de nosso looping a instrução é verdadeira então dentro do looping escrevemos a mensagem e somamos mais 1 a variável $i com o operador de pós incremento. Após terminar isto o looping volta e avalia $i aqui com o valor de 2 e se for verdadeira a expressão do while inicia tudo novamente.

Você sabe o porquê do $i no nosso looping? A utilidade dele ali é fazer em um momento a expressão se tornar falsa senão teremos um looping infinito. Como o nosso while avalia se $i é menor que 100 se sempre ele for menor que 100 o looping nunca parará, por isso que temos que incrementá-lo para poder uma hora ele chegar ao valor em que a instrução se tornará falsa. Observe o código em que não incrementamos o $i antes de sairmos do looping. Execute e rapidamente pause a execução do browser, pois como isto nunca terá fim seu browser vai ir ficando bem lento e podendo até travar. Se não quiser testar o resultado será “1 - Estou aprendendo loopings no Aprender PHP” infinitamente um por linha.

<?php

$mensagem = "Estou aprendendo loopings no Aprender PHP";

$i = 1;
while( $i <= 100 ){
  echo $i . ' - ' .$mensagem . '<br />' . PHP_EOL ;
}

?>

Observe agora o mesmo exemplo de Bart Simpson escrevendo de 1 a 100, no entanto agora ele escrevendo os números em ordem decrescente.

<?php

$mensagem = "Estou aprendendo loopings no Aprender PHP";

$i = 100;
while( $i >= 1 ){
  echo $i . ' - ' .$mensagem . '<br />' . PHP_EOL ;
  $i--;
}

?>

Veja que alteramos apenas a lógica agora iniciamos o $i com 100 e executamos o looping enquanto $i for maior ou igual a 1 e a cada volta do looping diminuímos um para que em um momento termos $i com o valor de 1 e encerrarmos o looping.

Em relação à estrutura de controle while:

  • A expressão a ser avaliada é declarada no inicio do while
  • Expressões são realizadas por operadores lógicos e operadores de comparação
  • O looping é executado enquanto a condição da expressão for verdadeira (True)
  • Quando a condição da expressão for avaliada como falsa (False) o processamento da rotina é desviado para fora do looping
  • O bloco de código referente ao looping deve ser delimitado por chaves {}
  • Endente o código referente ao bloco em 4 espaços por questões de legibilidade, a como configurar o seu editor de texto para transformar Tabs em espaços
  • Utilizamos um contador para o looping não ficar um looping infinito
  • Declara-se o contador fora do looping
  • Não se esqueça de alterar o valor do contador para não cairmos em um looping infinito.

O do-while no PHP

Bastante parecido com o while o do-while caracteriza-se por uma estrutura que executa um teste lógico no fim do looping. Tem seu funcionamento baseado em decisões assim como o while, no entanto pelo menos uma vez será executado o conjunto de instruções, pois a condição da validade, verdadeiro ou falso, é avaliado no final.

Problema

Continuaremos o mesmo problema de Bart Simpson, no entanto agora utilizando o do-while.

Diagrama de blocos

Veja como seria a representação do mesmo problema de Bart, no entanto agora utilizando o do-while.

Diagrama de blocos do do-while no php

Basicamente o mesmo diagrama de blocos do feito anteriormente para o while, no entanto observe que a expressão é avaliada no final, se for verdadeira a expressão escrevemos a mensagem e incrementamos em 1 o contador se for falsa saímos do looping.

No PHP

Observe como ficaria a representação em PHP da solução do problema de Bart Simpson agora com o uso do do-while.

<?php

$mensagem = "Estou aprendendo loopings no Aprender PHP";

$i = 1;

do {
  echo $i . ' - ' .$mensagem . '<br />' . PHP_EOL ;
  $i++;
} while( $i <= 100 );

?>

Você observou que temos todos os elementos que tínhamos no while né? O contador, incrementar o contador, uma expressão. No entanto agora temos o “do” que quer dizer que pelo menos uma vez será executado mesmo que a condição na expressão seja avaliada como falsa, lembrando que assim como o while o do-while é executado enquanto a expressão for verdadeira, observe abaixo onde Bart muito esperto alterou seu contador para dizer ao diretor que já havia escrito 150 vezes.

<?php

$mensagem = "Estou aprendendo loopings no Aprender PHP";

$i = 150;

do {
  echo $i . ' - ' .$mensagem . '<br />' . PHP_EOL ;
  $i++;
} while( $i <= 100 );

?>

Veja que mesmo a expressão sendo falsa, 150 não é menor nem igual a 100, o looping foi executado pelo menos uma vez, pois a avaliação da expressão é feita no final. Agora veja com o while o que ocorreria.

<?php

$mensagem = "Estou aprendendo loopings no Aprender PHP";

$i = 150;

while ( $i <= 100 ) {
  echo $i . ' - ' .$mensagem . '<br />' . PHP_EOL ;
  $i++;
}

?>

Como no while a expressão é avaliada no começo, o looping não foi executado nenhuma vez. Já no do-while como a expressão só é avaliada no final pelo menos uma vez o looping será executado.

Em relação à estrutura de controle do- while:

  • A expressão a ser avaliada é declarada no final do do-while
  • É garantido que pelo menos uma vez o looping será executado devido à dica anterior
  • Expressões são realizadas por operadores lógicos e operadores de comparação
  • O looping é executado enquanto a condição da expressão for verdadeira (True)
  • Quando a condição da expressão for avaliada como falsa (False) o processamento da rotina é desviado para fora do looping
  • O bloco de código referente ao looping deve ser delimitado por chaves {}
  • Endente o código referente ao bloco em 4 espaços por questões de legibilidade, a como configurar o seu editor de texto para transformar Tabs em espaços
  • Utilizamos um contador para o looping não ficar um looping infinito
  • Declara-se o contador fora do looping
  • Não se esqueça de alterar o valor do contador para não cairmos em um looping infinito.

Comentários

comments powered by Disqus