sair de se e foreach

277

Eu tenho um loop foreach e uma declaração if. Se uma correspondência for encontrada, eu preciso sair do foreach.

foreach($equipxml as $equip) {
    $current_device = $equip->xpath("name");
    if ( $current_device[0] == $device ) {
        // found a match in the file            
        $nodeid = $equip->id;
        <break out of if and foreach here>
    }       
}
au_stan
fonte
para php não js. Não posso assumir que eles se comportam da mesma maneira.
au_stan
6
gee - eu tenho que parar de usar tanto o jQuery. por que isso recebeu um voto negativo? +1, pergunta perfeitamente razoável e bem colocada.
22412 mrtsherman
11
Eu só fiz a pergunta porque (por qualquer motivo) eu não conseguia entender o doc do php break e seus exemplos. tudo bem embora. Não estou aqui para obter crachás e pontos, apenas boas respostas.
11_12 au_stan

Respostas:

610

if não é uma estrutura de loop, então você não pode "sair dela".

Você pode, no entanto, sair do processo foreachsimplesmente ligando break. No seu exemplo, ele tem o efeito desejado:

foreach($equipxml as $equip) {
    $current_device = $equip->xpath("name");
    if ( $current_device[0] == $device ) {
        // found a match in the file            
        $nodeid = $equip->id;

        // will leave the foreach loop and also the if statement
        break;
    }
    this_command_is_not_executed_after_a_match_is_found();
}

Apenas pela integridade de outras pessoas que se deparam com essa pergunta em busca de uma resposta.

breakaceita um argumento opcional, que define quantas estruturas de loop devem ser quebradas. Exemplo:

foreach (array('1','2','3') as $a) {
    echo "$a ";
    foreach (array('3','2','1') as $b) {
        echo "$b ";
        if ($a == $b) { 
            break 2;  // this will break both foreach loops
        }
    }
    echo ". ";  // never reached
}
echo "!";

Resultado resultante:

1 3 2 1!

Kaii
fonte
37
+1 - ótimos exemplos para algo que programadores inexperientes às vezes lutam.
Jim D
1
Útil, obrigado. Carma extra por mencionar o argumento. A coisa se-loop parece um hack, no entanto. Por que não apenas envolver o restante das declarações em outra se? Eu sei que você estava apenas tentando ser útil, mas observe os novatos.
Dan Barron #
3
Para aqueles que estão chegando aqui, mas pesquisando como interromper um loop que contém uma instrução include, use return em vez de continuar.
Nick Constantine
E se for uma declaração de troca? As instruções de troca também usam quebras. Alguém simplesmente colocaria duas interrupções dentro do switch, por exemplo, {case "break": echo 'break the switch and the loop'; quebrar; }?
Jevon # dez19
@ Jevon não, você também simplesmente escreveria switch($a) { case 'x': switch($b) { case 'x': break 2; }; break; } as break 2instruções internas das duas folhas.
Kaii
13
foreach($equipxml as $equip) {
    $current_device = $equip->xpath("name");
    if ( $current_device[0] == $device ) {
        // found a match in the file            
        $nodeid = $equip->id;
        break;
    }
}

Basta usar break. Isso fará isso.

Dabbler decente
fonte
então o intervalo está rompendo com o foreach e não com o if. Eu acho que minha confusão foi com essa afirmação que if ($abort_if_block) break;eu havia originalmente estabelecido break 2e falhou. obrigado #
9_12
2
Cuidado com a construção de quebra. Se você esquecer o; depois disso, pode obter o resultado da próxima expressão e começar a se comportar inesperadamente (o IE salta muito mais do que você gostaria). Eu sei que todo mundo sugere contra o uso do GOTO, mas acho que, para todos os casos em que você não pode realmente fazer melhor do que fazer uma pausa, um goto pode ser uma opção melhor. Claro, para pular para a frente (não muito longe) apenas e sem abuso! ;-)
maraspin
2

A maneira mais segura para aproximar a quebra de um foreachou whilecircuito em PHP é aninhar uma variável do contador de incrementação e ifdentro condicional do ciclo inicial. Isso permite um controle mais rígido do break;que pode causar estragos em outros lugares de uma página complicada.

Exemplo:

// Setup a counter
$ImageCounter = 0;

// Increment through repeater fields
while ( condition ):
  $ImageCounter++;

   // Only print the first while instance
   if ($ImageCounter == 1) {
    echo 'It worked just once';
   }

// Close while statement
endwhile;
serraosays
fonte
A sintaxe não está correta. Se você quiser usar a endwhiledeclaração, você precisa escrever while (..): ...; endwhile;- observe os dois pontos aqui depois while!
Kaii
0

Para aqueles que estão chegando aqui, mas pesquisando como interromper um loop que contém uma instrução include, use return em vez de interromper ou continuar.

<?php

for ($i=0; $i < 100; $i++) { 
    if (i%2 == 0) {
        include(do_this_for_even.php);
    }
    else {
        include(do_this_for_odd.php);
    }
}

?>

Se você quiser quebrar quando estiver dentro do_this_for_even.php, precisará usar return. Usar interromper ou continuar retornará este erro: Não é possível interromper / continuar 1 nível. Encontrei mais detalhes aqui

Nick Constantine
fonte