Dando continuidade ao Guia de PHP neste tópico vou mostrar como utilizar os laços do PHP. Você deve estar se perguntando: O que são laços em PHP? Laços são repetições de código que são executadas por comandos, dentro deles temos: while, do while, for, foreach.

Onde utilizamos laços em PHP?

Conforme falado no tópico sobre variáveis e arrays, onde mencionei que os laços seriam utilizados para correr os arrays. Este é um dos usos mais comuns dos laços, percorrer os itens de um array, percorrer os itens de uma busca (query) no banco de dados.

Podemos utilizar ainda um laço para alcançar um número, ou percorrer as letras do alfabeto. Vou fazer uma série de exemplos onde você poderá ver a necessidade de uso de um laço. Ainda não falarei sobre a query no banco de dados, pois este item ficará para um tópico em específico, quando falarmos de conexão de banco de dados.

Laços em PHP: While

O while significa que deve executar o código dentro dos parênteses até que a condição seja satisfeita. O while é composto da palavra while, seguido de abertura de parêntese, uma condição e fechamento de parêntese, o que vier abaixo é o código que será repetido até que a condição seja satisfeita. Veja o exemplo abaixo:

$contador = 0;
while($contador < 10)
{
echo "O contador agora e: " . $contador . "
";
$contador++;
}

/*Resultado:
O contador agora e: 0
O contador agora e: 1
O contador agora e: 2
O contador agora e: 3
O contador agora e: 4
O contador agora e: 5
O contador agora e: 6
O contador agora e: 7
O contador agora e: 8
O contador agora e: 9
*/
?>

Temos a palavra while, a abertura de parêntese, a condição nossa que é a variável $contador ser menor que 10, fechamento de parêntese, abertura de chave, e é este código que será repetido até que $contador seja menor que 10, e fechamento de chave.

O código echo é para ilustrar o avanço do contador. Já a linha $contador++; significa que estamos incrementando o contador, ou seja, somando 1 a cada vez que o laço fecha o ciclo.

Em palavras mais fáceis de compreender o código faz:

  • Contador = 0;
  • Enquanto o contador for menor que 10 faz:
    • Escreve a mensagem na tela com o valor atualizado do contador;
    • Incrementa o contador;
  • Verifica novamente se o contador é menor que 10:
    • Sim, então percorre o laço novamente;
    • Não, então termina o código.

Este laço vai correr 10 vezes o código entre chaves, começando a mostrar que o contador inicial é 0 e percorrendo até o 9. Por que o contador não foi até o 10? Por que nosso laço esta verificando e correndo o código enquanto o $contador for menor que 10.

Como correr até o número 10?

Para percorrer até o número 10, você deve fazer a condição, <= (menor ou igual), conforme exemplo abaixo:

while($contador <= 10)
...
//outro exemplo
$contador = 5;
while($contador > 0)
{
echo "O contador agora e: " . $contador . "
";
$contador--;
}

//mais um
$contador = 5;
while($contador >= 0)
{
echo "O contador agora e: " . $contador . "
";
$contador--;
}
?>

No primeiro exemplo, fiz com que o contador fosse até o número 10, então, começando em 0 ele vai percorrer 11 vezes o laço.

No segundo exemplo, fiz o contrário do primeiro, temos um valor no contador = 5, e vamos correr o laço até que este contador seja > 0 (maior que zero). Ou seja, do 5 até o 1. E ao invés de eu incrementar o contador, eu decrementei ele, ou seja, diminuí um valor a cada passagem pelo laço.

No terceiro exemplo o teste é feito até que seja maior ou igual a 0, ou seja, vai percorrer do 5 até o 0, serão 6 vezes no laço.

RESUMO:
++ = incrementa um valor no contador
-- = decrementa um valor no contador

Laços em PHP: Do while

Muito similar ao while, porém com uma única diferença. Ao invés de primeiro testar a condição, o PHP vai primeiro passar pelo laço para depois testar a condição. A sintaxe está abaixo:

$contador = 10;
do
{
echo "O contador agora e: " . $contador . "
";
$contador--;
}
while($contador > 0)
/*
RESULTADO:
O contador agora e: 10
O contador agora e: 9
O contador agora e: 8
O contador agora e: 7
O contador agora e: 6
O contador agora e: 5
O contador agora e: 4
O contador agora e: 3
O contador agora e: 2

O contador agora e: 1
*/
?>

O laço vai sempre entrar na primeira vez para depois fazer a comparação da condição. Ou seja, o DO WHILE, sempre executa pela primeira vez, independente da condição ser verdadeira, veja o que estou falando no exemplo abaixo:

$contador = 0;
do
{
echo "O contador agora e: " . $contador . "
";
$contador--;
}
while($contador > 0)
/*
RESULTADO:
O contador agora e: 0
*/
?>

Como pode ver, o contador mesmo sendo 0 entrou no laço, pois ele vai testar somente no final. Esta é a diferença entre o WHILE e o DO WHILE.

Laços do PHP: FOR

O laço FOR em PHP é muito usado quando você sabe de onde até onde quer ir. A sintaxe do FOR pode ser vista abaixo:

for($contador = 0; $contador < 10; $contador++)
{
echo "O contador agora e: " . $contador . "
";
}
/*
RESULTADO
O contador agora e: 0
O contador agora e: 1
O contador agora e: 2
O contador agora e: 3
O contador agora e: 4
O contador agora e: 5
O contador agora e: 6
O contador agora e: 7
O contador agora e: 8
O contador agora e: 9
*/
?>

Lendo o comando FOR:

  • Faça:
    • Contador começa em 0;
    • Enquanto o contador for menor que 10;
    • Incrementa o contador;
    • Executa os comandos necessários dentro do laço;

No for, iniciamos setando nossa variável pelo valor inicial, seguido de um ponto-e-vírgula, depois definimos a nossa condição (no exemplo, o contador deveria ser menor que zero para satisfazer a condição), seguido de outro ponto-e-vírgula, e a terceira parte é onde incrementamos o valor do contador do laço. Para só então começarmos a entrar nos códigos que devem ser executados repetidamente.

Correndo um ARRAY de única linha com FOR em PHP:

Como mencionado no tópico sobre arrays, vou mostrar aqui como percorrer um array com o FOR, confira no exemplo:

$frutas = array('maca','banana','melancia','melao','abacaxi','laranja');
for($posicao = 0; $posicao < count($frutas); $posicao++)
{
echo "A fruta na posicao: " . $posicao . " e " . $frutas[$posicao] . "
";
}
/*
RESULTADO:
A fruta na posicao: 0 e maca
A fruta na posicao: 1 e banana
A fruta na posicao: 2 e melancia
A fruta na posicao: 3 e melao
A fruta na posicao: 4 e abacaxi
A fruta na posicao: 5 e laranja
*/
?>

No exemplo acima, temos um array de única linha, onde chamei ele de frutas e adicionei alguns valores dentro dele com o nome de algumas frutas. Depois no comando FOR, iniciei a variável $posicao = 0; e enquanto a posição fosse menor que COUNT($frutas); eu incrementaria a $posicao.

Bom, a função COUNT que chamei, conta a quantidade de itens dentro de um array. Se você der um:

echo count($frutas);
//resultado = 6
?>

Ele vai retornar a quantidade de posições que tem dentro do array. Veja que a quantidade de posições é 6, pois temos 6 "frutas" dentro do array. E não o valor 5 que foi o resultado do for, lembrando do último tópico que o ARRAY começa a contar em 0.

Correndo um ARRAY de multipla linha com FOR em PHP:

Assim como única linha, podemos percorrer um array com multi-linhas, para isto, precisamos ao invés de usar um for, vamos usar 2 e assim precisamos de dois contadores também, veja no exemplo abaixo:

$valores = array(
array('linha0pos0','linha0pos1','linha0posx'),
array('linha1pos0','linha1pos1','linha1posx'),
array('linhaxpos0','linhaxpos1','linhaxposx'),
);

for($posicao1 = 0; $posicao1 < count($valores); $posicao1++)
{
for($posicao2 = 0; $posicao2 < count($valores[$posicao1]); $posicao2++)
{
echo "O valor na linha ".$posicao1." coluna " . $posicao2 . " e ==== " . $valores[$posicao1][$posicao2] . "
";
}
}
/*
print_r do array
Array
(
[0] => Array
(
[0] => linha0pos0
[1] => linha0pos1
[2] => linha0posx
)
[1] => Array
(
[0] => linha1pos0
[1] => linha1pos1
[2] => linha1posx
)
[2] => Array
(
[0] => linhaxpos0
[1] => linhaxpos1
[2] => linhaxposx
)
)

RESULTADO =============
O valor na linha 0 coluna 0 e ==== linha0pos0
O valor na linha 0 coluna 1 e ==== linha0pos1
O valor na linha 0 coluna 2 e ==== linha0posx
O valor na linha 1 coluna 0 e ==== linha1pos0
O valor na linha 1 coluna 1 e ==== linha1pos1
O valor na linha 1 coluna 2 e ==== linha1posx
O valor na linha 2 coluna 0 e ==== linhaxpos0
O valor na linha 2 coluna 1 e ==== linhaxpos1
O valor na linha 2 coluna 2 e ==== linhaxposx
*/
?>

Para contar um array múltiplo, como pode ter visto, temos um FOR dentro de outro FOR. E também temos 2 contadores, o $posicao1 e o $posicao2. Usamos 2x a função COUNT, uma para saber o número de linhas (que é para correr o primeiro FOR) e o segundo que é para saber o número de colunas (que é para correr o segundo FOR).

Ou seja, temos o primeiro FOR para correr todas as linhas, e o segundo FOR para correr todas as colunas da linha em que o primeiro FOR se encontra.

Foram 3 exemplos de como percorrer o FOR. Espero que tenha compreendido como ele funciona. Para quem está iniciando pode parecer um pouco complicado, mas quando for utilizar ele com mais frequência, verá que é simples. No final deste tópico vou colocar alguns exercícios para que você os faça, também vou deixar todos os exemplos em um arquivo que vou deixar para download. Assim poderá ver como foi feito e mexer nos itens para estudar e testar da forma que melhor lhe convir.

Laços em PHP - FOREACH:

O FOREACH tem o mesmo funcionamento do FOR, porém, ele não precisa de contador. Ou seja, você vai correr o laço sabendo em que posição está. Veja abaixo o primeiro exemplo da SINTAXE do FOREACH.

$frutas = array('maca','banana','melancia','melao','abacaxi','laranja');
foreach($frutas as $fruta)
{
echo "A fruta e: ". $fruta . "
";
}
/*
RESULTADO:
A fruta e: maca
A fruta e: banana
A fruta e: melancia
A fruta e: melao
A fruta e: abacaxi
A fruta e: laranja
*/
?>

A sintaxe do FOREACH é assim, você inicia com FOREACH, abre parênteses, diz qual é o array a ser percorrido, define a palavra AS e depois define o nome da variável que vai estar na posição atual. O próprio FOREACH vai inserir o valor na variável escolhida, e está poderá ser usada dentro do laço, conforme o exemplo acima.

Correndo um array multi-linhas com FOREACH

Fiz um array com tipos de frutas e frutas, que pode ser visto abaixo:

$frutas = array(
'vermelhas' => array ('maca','melancia'),
'amarelas' => array ('banana','melao','abacaxi'),
'verdes' => array ('pera','limao','abacate')
);
/*
RESULTADO DO PRINT_R
Array
(
[vermelhas] => Array
(
[0] => maca
[1] => melancia
)
[amarelas] => Array
(
[0] => banana
[1] => melao
[2] => abacaxi
)
[verdes] => Array
(
[0] => pera
[1] => limao
[2] => abacate
)
)
*/
?>

Como pode ver, temos a linha como sendo os tipos de frutas (vermelhas, amarelas e verdes), e dentro de cada um dos tipos temos as frutas que pertencem ao grupo. Abaixo o código para percorrer elas:

foreach($frutas as $tipo => $frutastipo)
{
echo "
O TIPO DE FRUTA E: ".$tipo."
";
foreach($frutastipo as $fruta)
{
echo "A fruta e: ". $fruta."
";
}
}
/*
RESULTADO DO FOREACH
O TIPO DE FRUTA E: vermelhas
A fruta e: maca
A fruta e: melancia
O TIPO DE FRUTA E: amarelas
A fruta e: banana
A fruta e: melao
A fruta e: abacaxi
O TIPO DE FRUTA E: verdes
A fruta e: pera
A fruta e: limao
A fruta e: abacate
*/
?>

Como pode ver, temos um foreach dentro de outro. No primeiro foreach, fizemos um outro uso dele. Diferente do primeiro exemplo, neste nós precisamos saber do nome da chave do array (os tipos das frutas) para que possamos identificar os valores dentro dos tipos.

A sintaxe é assim:

foreach($array as $chave => $valor)
?>

Ou seja, percorre o $array e coloca dentro do laço a $chave e os valores ($valor) desta chave. Assim conseguimos saber em que linha estamos e quais os valores desta linha para então entramos no segundo FOREACH o percorrer quais frutas estão na linha dos TIPOS.

Percorrendo o alfabeto em PHP com FOR:

Para percorrer o alfabeto usando um FOR, precisamos usar duas funções do PHP, chamadas ord() e chr(). A ORD retorna a posição na tabela ASCII do caractere, assim sabemos que precisamos correr de um número inicial na tabela o A, até o Z, outro número da tabela. Veja o exemplo abaixo que vai entender melhor:

for($letra = ord("A"); $letra <= ord('Z'); $letra++)
{
echo chr($letra).",";
}
/* RESULTADO
A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,
*/
?>

Usamos a ORD(A) para saber posição inicial, e ORD(Z) para saber a final, e percorremos o array. A variável $letra terá um número nela, que ao usar a função CHR($letra), estamos buscando qual caractere está na posição que a variável letra se encontra.

Conclusão

Bom, o tópico de hoje foi falando sobre laços, mostramos como fazer um laço do tipo while, do while, for e foreach. Existem mais exemplos que podem ser vistos ainda, mas vamos deixar para próximos tópicos pois este já se alastrou bastante. A ideia é ter um número máximo de caracteres dentro dos tópicos para não ficar tão extenso. Este aqui já passou de 13 mil.

Arquivo para download

Estrutura de laços em PHP (for, foreach, while, do while)