Para percorrer a lista podemos usar uma estrutura de repetição, como for, foreach, while, etc. Mas como evitar que o loop continue após encontramos o item desejado?
foreach ($funcionarios as $i => $funcionario){
if ($funcionario['id'] == 22{
$busca = $funcionario;}}
Por padrão, foreach continuará a percorrer a lista até que ela chegue ao final, mas nós querermos parar o loop bem aqui!
foreach ($funcionarios as $i => $funcionario){
if ($funcionario['id'] == 22{
$busca = $funcionario;
break;}}
O comando break nos permite encerrar a execução do loop em um momento específico. Nesse caso é exatamente o que desejamos!
Ok, e se quiséssemos coletar todos os demais itens, exceto o de id 22?
foreach ($funcionarios as $i => $funcionario){
if ($funcionario['id'] == 22{
continue;
$busca = $funcionario;}}
Para termos maior controle sobre estruturas de repetição também contamos com continue, que pula a execução atual, passando para próxima
Chamamos de fluxo de controle a ordem na qual cada declaração em um programa é interpretada e executada. Em estruturas como for, foreach, while, do-while ou switch, o fluxo de controle retorna à primeira declaração após a última ser executada, até que uma condição seja avaliada como falsa. Os comandos break e continue oferecem maior controle sobre tais estruturas, alterando o fluxo de controle para a próxima iteração ou encerrando todo ciclo de repetições.
Veremos como utilizar os comandos break e continue no PHP.
Break
Break encerra uma estrutura de repetição imediatamente. Geralmente usamos if/else para determinar o momento em que essa condição de encerramento será executada.
A sintaxe do comando do break é esta:
break;
No código abaixo encerramos a execução do while imediatamente após o contador $i alcançar o valor “3”. Como resultado serão impressos apenas os valores “1 2”, em lugar de “1 2 3 4”.
$i = 0; while ($i++ < 5) { if ($i == 3) break; echo $i . "\n"; }
Perceba que no caso acima break fez com que o laço fosse interrompido, mesmo antes da condição de encerramento $i++ < 5 ser satisfeita.
Continue
Continue pula a iteração atual, ignorando todo o código declarado abaixo dele, dentro da estrutura de repetição. Geralmente utilizamos if/else para determinar o momento em que esse comando deverá ser executado.
A sintaxe do comando continue é esta:
continue;
No código a seguir saltamos para a próxima iteração quando $i atinge o valor “3”. Como resultado o código echo $i . "\n" não imprimirá esse valor, apenas “1 2 4 5”.
$i = 0; while ($i++ < 5) { if ($i == 3) continue; echo $i . "\n"; }
Interrompendo vários laços
O Break aceita como argumento o número de estruturas aninhadas a serem interrompidas, sendo 1 seu valor padrão.
No código abaixo encerramos a execução de três while imediatamente após imprimir o valor “1”. Como resultado serão impressos apenas os valores “3 2 1”. Os comandos nas linhas 10 e 12 serão ignorados.
$i = 0; while ($i++ < 3) { echo "3\n"; while (1) { echo "2\n"; while (1) { echo "1\n"; break 3; } echo "Essa linha nunca vai ser exibida\n"; } echo "Nem essa linha\n"; }
Continue também aceita um argumento numérico opcional que diz quantos níveis de laços aninhados devem seguir para a próxima iteração. O valor padrão é 1, afetando apenas o laço em cujo escopo o comando está declarado.
No código abaixo saltamos para o início do primeiro while após imprimir o valor “1”. Como resultado serão impressos apenas os valores “3 2 1 3 2 1 3 2 1 ”. Os comandos nas linhas 10 e 12 serão, portanto, ignorados.
$i = 0; while ($i++ < 3) { echo "3\n"; while (1) { echo "2\n"; while (1) { echo "1\n"; continue 3; } echo "Essa linha nunca vai ser exibida\n"; } echo "Nem essa linha\n"; }
Comportamento do Switch
Diferentemente de outras linguagens, no PHP switch é considerada uma estrutura de repetição. Portanto, se switch está dentro de um for, ou qualquer outra estrutura de repetição, continue 2 também afetará o fluxo de execução em mais de um nível.
Como exemplo, no código abaixo os comandos continue 2 e break 2 impedirão que o valor “X” seja impresso em todas as iterações de while. Como resultado serão impressos apenas os valores “1a X 2c 3e X 4g”.
$i = 0; while ($i++ < 4) { switch ($i) { case 1: echo $i . "a\n"; continue; echo $i . "b\n"; case 2: echo $i . "c\n"; continue 2; echo $i . "d\n"; case 3: echo $i . "e\n"; break; echo $i . "f\n"; case 4: echo $i . "g\n"; break 2; echo $i . "h\n"; } echo "X\n"; }
Exemplo prático
No código a seguir apresentamos como buscar um funcionário pelo seu id, encerrando o foreach após esse valor ser encontrado. Dessa forma impedimos que todo o array seja processado desnecessariamente, poupando recursos.
<?php $funcionarios = array( array('id' => 1, 'nome' => 'João', 'salario' => 5000), array('id' => 22, 'nome' => 'Mauro', 'salario' => 560), array('id' => 8, 'nome' => 'Alice', 'salario' => 4300), ); foreach ($funcionarios as $i => $funcionario) { if ($funcionario['id'] == 22) { $busca = $funcionario; break; } } if (isset($busca)) { echo "Funcionário encontrado: {$busca['nome']} - {$busca['id']}"; } else { echo "Funcionário não encontrado"; } ?>
A seguir vemos como aplicar uma bonificação de 10% a funcionários com salário menor que R$5000,00, durante a iteração de todos os dados em um array. Logo após, são impressos os dados com o resultado de cada soma e o nome do funcionário.
<?php $funcionarios = array( array('id' => 1, 'nome' => 'João', 'salario' => 5000), array('id' => 22, 'nome' => 'Mauro', 'salario' => 560), array('id' => 8, 'nome' => 'Alice', 'salario' => 4300), ); foreach ($funcionarios as $i => $funcionario) { if ($funcionario['salario'] >= 5000) { continue; } $funcionarios[$i]['salario'] = $funcionario['salario'] + ($funcionario['salario'] * 0.1); } foreach ($funcionarios as $funcionario) { echo $funcionario["nome"]." $".$funcionario["salario"]."\n"; } ?>