Laços de repetição PHP realizam ou repetem diferentes ações dependendo de condições avaliadas como verdadeiras ou falsas. São muito utilizados para automatizar milhares de funções no seu código. Aprenda mais sobre os laços de repetição PHP.

Existem vários modos para percorrer arrays, no entanto, nenhum deles é mais simples do que utilizando o laço foreach em PHP. Este comando funciona só com arrays e objetos, e retorna um erro quando utilizado com outros tipos de expressões.

O laço foreach pode ser utilizado em dois formatos diferentes, uma mais simples:

foreach ( $meu_array as $valor_do_array ) {
	echo $valor_do_array;
}

No formato indicado acima, a variável "$valor_do_array" automaticamente recebe o valor de cada item do array, por exemplo:

<?php
/* O array */
$meu_array = array(
	'Valor 1',
	'Valor 2',
	'Valor 3',
	'Valor 4'
);

/* O laço foreach simples */
foreach ( $meu_array as $seu_valor ) {
	echo $seu_valor . '<br>';
}
?>

O trecho de código acima vai mostrar todos os valores de todos os itens do array, ou seja:

Valor 1
Valor 2
Valor 3
Valor 4

O outro formato que pode ser utilizado com o comando foreach é o seguinte:

foreach ( $meu_array as $chave_do_indice => $valor_do_indice ) {
	echo $chave_do_indice;
	echo $valor_do_indice;
}

No formato mais avançado, ao invés de obter apenas o valor, você pode configurar duas variáveis. A primeira será a chave do índice e a segunda o valor desse mesmo índice. A cada volta do laço, foreach pega um item do seu array na ordem em que ele estiver, começando pelo primeiro.

Caso você queira alterar o valor do seu array dentro de um laço foreach, é necessário passar o valor por referência, veja:

<?php
/* O array */
$meu_array = array(
	'Valor 1',
	'Valor 2',
	'Valor 3',
	'Valor 4'
);

echo '<pre>';
print_r( $meu_array );
echo '</pre>';

/*
Array
(
    [0] => Valor 1
    [1] => Valor 2
    [2] => Valor 3
    [3] => Valor 4
)
*/

/* O laço foreach simples */
foreach ( $meu_array as $chave_do_indice => &$valor_do_indice ) {
	$valor_do_indice = $valor_do_indice . '  Valor alterado.';
}

echo '<pre>';
print_r( $meu_array );
echo '</pre>';

/*
Array
(
    [0] => Valor 1  Valor alterado.
    [1] => Valor 2  Valor alterado.
    [2] => Valor 3  Valor alterado.
    [3] => Valor 4  Valor alterado.
)
*/
?>

Perceba acima que o valor do meu array foi alterado dentro do laço foreach, e para que isso se tornasse possível, só precisei adicionar um & (E comercial) antes do valor, fazendo a expressão ficar assim:

foreach ( $array as $chave => &$valor ) {
	$valor = 'Agora o valor é alterado';
}

Nota: Isso se chama passar o valor "por referência".

A palavra break e o laço foreach

O laço foreach vai navegar por todos os itens do seu array, independente da quantidade. Caso você queira parar um laço antes que ele tenha passado por todos os itens do array, a palavra break pode ser utilizada.

<?php
// O laço foreach contaria até 17
foreach ( array(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17) as $n ) {
	// Verifica se o valor é maior que 5
	if ( $n > 5 ) {
		// Para o laço antes que ele termine
		break;
	}
	
	// Imprime o número
	echo $n;
}
?>

No trecho de código acima, o laço foreach contaria todos os 17 itens do array, porém, como estou utilizando uma estrutura condicional if para saber se o valor é maior que 5 e mostrando a palavra break caso verdadeiro, assim que o valor de $n for maior do que 5 o laço vai parar.

Algumas considerações sobre o laço foreach

  • Quando o foreach inicia sua primeira execução, ele automaticamente começa a contagem do primeiro item do array. Isso significa que você não precisa chamar a função reset() antes de um loop foreach
  • O operador de controle de erros @ não funciona dentro de um laço foreach
  • Para alterar o valor de um array dentro de um laço foreach, é necessário passar o valor por referência (com um & antes);
  • Foreach só funciona com arrays e objetos, nada mais;

Outra sintaxe

Assim como várias outras partes da linguagem PHP, foreach também pode ser escrito de outra maneira, veja:

foreach ($array as $value):
	echo $value;
endforeach;

Ou seja, as chaves { e }, podem ser trocadas por dois pontos (:) e a palavra chave endforeach;.

Saiba mais

Você sempre poderá saber mais sobre o comando foreach em PHP no próprio manual da linguagem, não deixe de acessar e ler. Se achar algo muito complicado, volte e pergunte.

Aulas anteriores

Veja todas as aulas, e mais, na categoria Curso de PHP do Tutsup.

Laços for em PHP são os mais complexos da linguagem. Você pode controlar suas ações baseando-se em três expressões: um valor inicial (opcional); uma expressão condicional (opcional); uma terceira expressão (opcional), que, normalmente, altera o valor inicial.

for ( $expressão_1; $expressão_2; $expressão_3; ) {
	// Ação
}

A primeira expressão é executada uma vez, sem condição alguma, no começo do laço. Com isso, você pode criar uma variável e dar um valor para ela utilizando essa expressão, por exemplo.

<?php
for ( $variavel = 1; $exp2; $exp3; ) {
	// Ação
}
?>

Na expressão acima, a $variavel agora tem valor 1.

A segunda expressão deverá retornar um valor verdadeiro (true) para que o laço seja executado, caso retorne um valor falso (false), o laço termina. Veja abaixo um exemplo de condição que retorna um valor verdadeiro e utiliza o valor da primeira expressão.

<?php
for ( $variavel = 1; $variavel < 10; $expressao_3 ) {
	// Ação
}
?>

Perceba que a expressão 2 avalia se $variavel (da expressão 1) é menor do que 10 ($variavel < 10). A cada volta do laço essa expressão será avaliada para que o interpretador do PHP saiba quando parar o laço. Por esse motivo, precisamos alterar o valor de $variavel para que, em algum momento, a expressão seja avaliada como falsa (false). Se não fizermos isso teremos um loop infinito.

A terceira expressão é executada incondicionalmente a cada volta do laço, com isso podemos alterar o valor da primeira expressão utilizando-a.

<?php
for ( $variavel = 1; $variavel < 10; $variavel++ ) {
	echo $variavel;
}
?>

Perceba acima que utilizando apenas o laço for, consigo criar uma variável, avaliar o valor dessa variável e alterar seu valor caso necessário. Como no trecho anterior, que criei a $variavel com valor 1, verifiquei se o valor da variável é menor do que 10 ($variavel < 10) e somei mais um ($variavel++) na variável a cada volta do laço.

Resumo das expressões de for em PHP

Só para recapitular de uma maneira mais compacta e resumida, vejamos o que cada expressão faz:

  • Expressão 1: É executada apenas uma vez no início do laço;
  • Expressão 2: Deve retornar um valor boolean verdadeiro (true) para que o laço continue; É executada a cada volta do laço;
  • Expressão 3: É executada a cada volta do laço.

Cada expressão pode estar vazia ou separada por vírgula, porém, o resultado é capturado da última parte. Para a expressão dois, ao contrário do que se imagina, um valor verdadeiro (true) é retornado quando ela estiver vazia.

Isso significa que o trecho de código abaixo está correto:

<?php
// Variável inicial
$numero = 0;

// For sem expressões
for ( ; ; ) {
	// Verifica se $número é maior que 10
	if ( $numero > 10 ) {
		// A palavra break para o laço
		// Isso evita um laço infinito
		break;
	}
	
	// Mostra o número na tela
	echo $numero;
	
	// Incrementa o número em +1
	$numero++;
}
?>

Perceba que a palavra break (significa pausa em inglês), para o laço. Por isso, tive que utilizar uma estrutura condicional if para analisar minha expressão (o mesmo que a expressão 2 do for faz) e executar o "break".

For com arrays

For também pode ser utilizado para percorrer arrays, porém, você vai precisar utilizar a função count do PHP para saber quantos itens existem nesse array, veja:

<?php
// Arrays 
$frutas = array(
	'banana',
	'maçã',
	'uva'
);

// For percorre o array
for ( $i = 0; $i < count( $frutas ); $i++ ) {
	echo 'Gosto de comer ' . $frutas[$i] . ' pela manhã <br />';
}
?>

Perceba que no trecho acima criei um array simples com 3 valores. Na expressão 1 do laço for, criei uma variável $i com valor 0, na expressão 2 verifiquei se o valor de $i é menor que o número de itens do meu array, na expressão 3, somei mais um (+1) em $i.

O valor de $i terá o seguinte caminho nesse caso:

  • 0: na primeira volta do laço (quando o valor foi criado);
  • 1: na segunda volta do laço
  • 2: na terceira volta do laço
  • Quando o valor for 3, a segunda expressão será avaliada como falsa e o laço para.

Ou seja, o trecho acima seria o mesmo que o trecho abaixo (se não houvesse o for):

<?php
// Arrays 
$frutas = array(
	'banana',
	'maçã',
	'uva'
);

echo 'Gosto de comer ' . $frutas[0] . ' pela manhã <br />';
echo 'Gosto de comer ' . $frutas[1] . ' pela manhã <br />';
echo 'Gosto de comer ' . $frutas[2] . ' pela manhã <br />';
?>

Como temos apenas poucos valores e poucas ações, não faz muita diferença se eu utilizar for ou escrever o código manualmente, porém, imagine o mesmo array com milhares de valores e várias ações dentro do laço! Seria bem inconveniente ter que escrever tudo manualmente.

Outra sintaxe para for

For também pode ser escrito da seguinte maneira:

<?php
// Arrays 
$frutas = array(
	'banana',
	'maçã',
	'uva'
);

// For percorre o array
for ( $i = 0; $i < count( $frutas ); $i++ ):
	echo 'Gosto de comer ' . $frutas[$i] . ' pela manhã <br />';
endfor;
?>

Trocar as chaves { e } por dois pontos (:) e a palavra chave endfor; não faz diferença alguma, você pode utilizar a forma que preferir para escrever.

Aulas anteriores

Veja todas as aulas, e mais, na categoria Curso de PHP do Tutsup.

O laço do while em PHP funciona de maneira extremamente similar ao laço while, porém, ao invés de avaliar a expressão e executar a ação caso ela seja avaliada como verdadeira, no laço do while a ação é executada e só depois a expressão é avaliada.

Nesse caso, você tem a certeza de que a ação será executada no mínimo uma vez, já que a expressão só será avaliada ao final da interação laço.

Outro ponto diferente do laço while, é que o laço do while é escrito de maneira um pouco diferente, veja:

do {
	Ação
} while ( condição );

Vamos ver ambos, while e do while na prática (para uma melhor explicação sobre apenas o laço while, acesse Laço While em PHP – Aula 17).

Do while em PHP

Suponhamos que eu queira contar até 10 utilizando um laço do while em PHP, veja o exemplo:

<?php
// Número inicial
$num = 0;

do {
	$num++;
	echo $num;
} while ( $num < 10 );

A expressão acima irá retornar exatamente 12345678910 na tela do navegador do usuário pelo seguinte:

  • Configuramos uma variável inicial com valor 0 ($num = 0);
  • No laço do while, a ação é executada, então, na primeira linha da ação somamos mais um (+1) na variável $num a cada interação do laço com o operador de incremento. Na segunda linha da ação mostramos o valor de $num na tela com o comando echo.
  • Na última linha do laço do while, verificamos a nossa expressão (se $num é menor que 10). O laço será executado enquanto $num for menor que 10. Como estamos incrementando de um em um a variável $num (0 + 1, 1 + 1, 2 + 1…), quando o valor da variável $num chegar em 10, o laço para de ser executado.

Neste caso, tanto o laço while quanto do while retornariam a mesma coisa na tela.

Veja:

<?php
// Número inicial
$num = 0;

// Do while retorna 12345678910
do {
	$num++;
	echo $num;
} while ( $num < 10 );

// Quebra de linha em HTML
echo '<br>';

// Zera a variável $num novamente
$num = 0;

// While retorna 12345678910
while ( $num < 10 ) {
	$num++;
	echo $num;
}
?>

Agora vamos avaliar uma expressão onde while e do while retornam valores diferentes:

<?php
// Número inicial
$num = 0;

// Do while retorna Ação executada na tela
do {
	echo 'Ação executada';
} while ( $num > 1 );

// While não retorna nada
while ( $num > 1 ) {
	echo 'Ação executada';
}
?>

Perceba que agora a minha expressão (condição) mudou, estou verificando se a variável $num é maior do que um ($num > 1), ou seja, como $num tem o valor zero (0), e zero não é maior que um, o valor retornado por ela será falso (false), consequentemente, a ação do laço não deveria ser executada. Porém, como o laço do while executa primeiro a ação e depois verifica a ação, o interpretador do PHP irá exibir "Ação executada" na tela pelo menos uma vez. Já para o laço while, a ação não será executada, porque a expressão foi analisada antes da ação ser executada.

Break – Pare o laço

Caso você queira parar o laço antes que ele verifique todas as expressões, você pode utilizar a palavra chave break, veja:

<?php
// Número inicial
$num = 0;

// Do while retorna Ação executada na tela
do {
	// Soma mais um em $num
	$num++;
	
	// Verifica se $num é maior que 10
	if ( $num > 10 ) {
		// Para o laço
		break;
	}
	
	// Mostra $num na tela
	echo $num;
} while ( $num < 1000 );
?>

No trecho de código acima, era de se esperar que o valor retornado fossem milhares de números (literalmente, de 1 a 1000) na tela, pois, minha expressão será avaliada enquanto $num for menor do que 1000. Porém, no meio do laço existe uma estrutura condicional if que avalia se $num é menor do que 10; se for, a palavra break será executada e o laço para de executar imediatamente.

Aulas anteriores

Veja todas as aulas, e mais, na categoria Curso de PHP do Tutsup.

Apesar de simples, o laço while é extremamente utilizado em PHP, principalmente quando você precisa exibir conteúdo da base de dados, ou executar o loop do WordPress.

While significa "enquanto" em português, ou seja, enquanto uma expressão for avaliada como verdadeira (true), uma ação é executada repetidamente. A expressão é testada a cada início do laço, portanto, se a mesma for avaliada como falsa (false) na primeira tentativa, a ação esperada não ocorre.

A estrutura do laço while é a seguinte:

while ( expressão ) {
	ação
}

Vamos ver como isso funciona na prática.

While em PHP

Qualquer expressão que seja avaliada como verdadeira pode ser utilizada com um laço while em PHP, porém, em algum momento essa expressão deverá retornar um valor falso, caso contrário, o loop nunca vai parar, então criamos aquilo que chamamos de laço infinito (ou loop infinito).

Normalmente, quando utilizamos dados que vêm da base de dados, a expressão que utilizamos é avaliada como verdadeira enquanto existirem linhas na consulta, neste caso não é necessário alterar nada dentro do laço, pois, a própria função utilizada vai retornar um valor falso quando chegar ao fim, porém, quando tentamos testar valores de variáveis, devemos alterar este valor dentro do laço para que nossa expressão seja avaliada como falsa em algum momento.

Suponhamos que eu queira contar até 10 utilizando um laço while, neste caso posso fazer da seguinte maneira:

<?php
// Número inicial
$num = 0;

// Laço com expressão "número menor ou igual a 10"
while ( $num <= 10 ) {
	// Mostra $num na tela
	echo $num;
	
	// Soma mais um em $num;
	$num++;
}
?>

Perceba acima que criei uma variável $num com um valor inicial (0), logo em seguida chamei o laço while com a expressão "$num <= 10" (número menor ou igual a 10). Dentro da ação, exibi o valor do número e, na última linha, somei seu valor com em mais um (+1) com o operador de incremento ++.

Como a condição (expressão) será verificada a cada volta do laço, toda vez que um laço for completo, a variável inicial $num terá um novo valor (0 + 1, 1 + 1, 2 + 1, 3 + 1 …). Quando seu valor atingir o número 11, minha condição será avaliada como falsa, pois, 11 é maior que 10, consequentemente a última ação (exibir o número 11) não será executada. Assim, o código continua para as próximas linhas (se existirem outras linhas).

Outra sintaxe

Assim como if/else/elseif, while também pode ser executado com outra sintaxe, veja:

<?php
// Número inicial
$num = 0;

// Laço com expressão "número menor ou igual a 10"
while ( $num <= 10 ):
	// Mostra $num na tela
	echo $num;
	
	// Soma mais um em $num;
	$num++;
endwhile;
?>

Perceba que você pode trocar as chaves { e } por dois pontos (:) e a palavra endwhile;. Não há nenhuma diferença além do modo de escrita.

Aulas anteriores

Veja todas as aulas, e mais, na categoria Curso de PHP do Tutsup.