Você pode 'sair' de um loop no PHP?


118

Eu tenho um loop que está fazendo uma verificação de erros no meu código PHP. Originalmente parecia algo assim ...

foreach($results as $result) {
    if (!$condition) {
        $halt = true;
        ErrorHandler::addErrorToStack('Unexpected result.');
    }

    doSomething();
 }

if (!$halt) {
    // do what I want cos I know there was no error
}

Isso funciona muito bem, mas ainda está em loop, apesar de depois de um erro não ser necessário. Existe uma maneira de escapar do loop?

Respostas:


211

Você está procurando a instrução break .

$arr = array('one', 'two', 'three', 'four', 'stop', 'five');
while (list(, $val) = each($arr)) {
    if ($val == 'stop') {
        break;    /* You could also write 'break 1;' here. */
    }
    echo "$val<br />\n";
}

13
@Gabriel, ele responde a pergunta, a amostra de código é exatamente isso, uma amostra. Você também pode reclamar do nome do array não descritivo "$ arr".
paxdiablo

5
@Gabriel: Estou postando um código referenciado diretamente no manual do PHP e ele mostra com precisão o uso da instrução break.
TheTXI

@Pax, pra mim isso é subjetivo, cada vez que coloco um exemplo tentei colocar um código do mundo real.
Gabriel Sosa

1
@Gabriel: Você não postou nenhum exemplo, e o link que você deu vai exatamente para a mesma fonte que eu forneci (que é de onde vem o código de amostra no topo). Você basicamente fez a mesma coisa que eu, mas fez com que o OP não visse a amostra até clicar no link.
TheTXI

3
No entanto, essa é uma maneira estranha de fazer um loop!
alex

151

Conforme declarado em outras postagens, você pode usar a palavra-chave break. Uma coisa que foi sugerida, mas não explicada, é que a palavra-chave pode assumir um valor numérico para dizer ao PHP de quantos níveis quebrar.

Por exemplo, se você tem três loops foreach aninhados um no outro tentando encontrar uma informação, você pode fazer 'break 3' para sair de todos os três loops aninhados. Isso funcionará para as estruturas 'for', 'foreach', 'while', 'do-while' ou 'switch'.

$person = "Rasmus Lerdorf";
$found = false;

foreach($organization as $oKey=>$department)
{
   foreach($department as $dKey=>$group)
   {
      foreach($group as $gKey=>$employee)
      {
         if ($employee['fullname'] == $person)
         {
            $found = true;
            break 3;
         }
      } // group
   } // department
} // organization

5
Bom ponto. Isso é explicado de forma bastante clara no manual do PHP próximo ao início. Não acho que isso fosse necessário para esta questão em particular, mas ainda é muito bom saber. +1
TheTXI

46

break; deixa seu loop.

continue; pula qualquer código para o restante desse loop e passa para o próximo loop, desde que a condição ainda seja verdadeira.


apenas o que eu precisava ... aquele "continue" para quebrar apenas o loop atual e não deixar o loop inteiro como o break faz.
K. Kilian Lindberg


4

Todas essas são boas respostas, mas gostaria de sugerir mais uma que considero um padrão de código melhor. Você pode escolher usar um sinalizador na condição de loop que indica se deve ou não continuar o loop e evitar usar breaktodos juntos.

$arr = array('one', 'two', 'three', 'four', 'stop', 'five');
$length = count($arr);
$found = false;
for ($i = 0; $i < $length && !$found; $i++) {
    $val = $arr[$i];
    if ($val == 'stop') {
        $found = true; // this will cause the code to 
                       // stop looping the next time 
                       // the condition is checked
    }
    echo "$val<br />\n";
}

Eu considero essa uma prática de código melhor porque não depende do escopo que breaké usado. Em vez disso, você define uma variável que indica se deve ou não interromper um loop específico. Isso é útil quando você tem muitos loops que podem ou não ser aninhados ou sequenciais.


3
$arr = array('one', 'two', 'three', 'four', 'stop', 'five');
foreach ($arr as $val) {
    if ($val == 'stop') {
        break;    /* You could also write 'break 1;' here. */
    }
    echo "$val<br />\n";
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.