Passo 1: Como localizar um item em uma lista de dados Passo 2: ...passando pelo menor número de itens? Passo 3: Para percorrer uma lista podemos criar um laço de repetição Passo 4: Mas isso certamente fará ela ser percorrida até o final Passo 5: Para evitar isso podemos usar o comando break Passo 6: Mas, e quando queremos pular uma iteração? Passo 7: Nesse caso podemos usar o comando continue
#PraCegoVer - Transcrição dos Slides Percorrer listas de dados é uma tarefa muito comum em aplicações, mas algumas vezes querermos locar e coletar apenas um item dentre os muitos que podem estar presentes, por exemplo, em funcionaro achar nome José Maria e id 22.
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";
}
?>