2010-12-28 37 views
14

¿Cómo puedo salir de un bloque if si se cumple una determinada condición?PHP - salir del bloque IF

He intentado utilizar break pero no funciona:

if($bla): 
    $bla = get_bla(); 
    if(empty($bla)) break; 
    do($bla); 
endif; 

que dice: Error grave: no se puede romper/continuar nivel 1 en ...

+2

check http://stackoverflow.com/questions/7468836/any-way-to-break-if-statement-in-php para más opiniones (: – AgelessEssence

Respuesta

9

¿Por qué no darle la vuelta?

if($bla): 
    $bla = get_bla(); 
    if(!empty($bla)) { 
    do($bla); 
    } 
endif; 

De esta forma sólo se ejecuta si el código $ bla no está vacío .. Eso es un poco el punto con sentencias if

+15

Su respuesta resuelve el problema pero no lo hace Responda la pregunta "¿Cómo puedo salir de un bloque if?", vale la pena observar si es posible alguna vez. – rahmanisback

+1

@rahmanisback Como usted dice, resuelve el problema, así que realmente no veo cuál es el problema con mi respuesta . Si solo mira una respuesta hacia abajo, verá que la pregunta está respondida. Cuando publiqué mi respuesta, ya había varias publicaciones respondiendo esto, así que lo que hice fue proporcionar una solución real. No puede romper una declaración if y si alguna vez tiene que hacerlo, lo está usando incorrectamente. – Sondre

+0

¡Resolvió mi problema! Estaba haciendo lo mismo, tratando de salir cuando podía reorganizar. Veo el mérito de responder realmente la pregunta, pero si la pregunta es utilizar un método inapropiado o no práctico, debe tenerse en cuenta. ¡Gracias! –

12

No se puede romper si las declaraciones, solo bucles como por o mientras.

Si this if está en una función, use 'return'.

2

No puede.

Puede poner todo en una función desde la que puede return.

De lo contrario, tendrá que cambiar la lógica e incluir otro bloque si.

if($bla): 
    $bla = get_bla(); 
    if(!empty($bla)): 
    do($bla); 
    endif; 
endif; 
37

En PHP 5.3 se puede utilizar goto

if($bla): 
    $bla = get_bla(); 
    if(empty($bla)) goto end; 
    do($bla); 
endif; 
end: 

Pero personalmente creo que es una solución fea.

+6

Why feo? Sería útil en ciertas situaciones de seguro. ¡Vota! – rahmanisback

+23

GOTO ha sido "prohibido" en una buena programación desde la edad de piedra – max4ever

+0

¿Puedo preguntar por qué las personas detrás de PHP lo presentaron en 2009? Podrían haber elegido no introducirlo en absoluto. Estoy de acuerdo con que se siente muy similar a DOS para mí (no en el buen sentido), pero puede ser útil con seguridad. – Thomas

3

No puedo creer que nadie tiene publicar esta solución todavía (escribirlo en mi estilo PHP):

if($bla){do{ 
    $bla = get_bla(); 
    if(empty($bla)) break; 
    do($bla); 
}while(false);} 

Complejidad todavía O (1)

+0

Wow. Pero todavía está totalmente pervertido ... Hemos llegado a nuestra disposición, incluso podemos usar un include() y volver desde allí, pero no podemos abandonar el bloque if ... – Marki

2

para mí esto ayuda a tener un marcador de escape en caso de que el código debe salir entre los bloques si no te importa tener un if statemen t en otro.

$exit = FALSE; 

if(!$exit){ 
    if($data["param1"] == cond1){ 
     //do something and continue 
    } 
    else{ 
     //do something 
     $exit = TRUE; 
    } 
} 

if(!$exit){ 
    if($data["param2"] == cond2){ 
     //do something and continue 
    } 
    else{ 
     //do something 
     $exit = TRUE; 
    } 
} 

{...} 

Si se mantiene la colocación de las sentencias condicionales alrededor de cada bloque, que no se ejecute cualquier otro bloque después de configurar la salida $ true. Puede asignarle un nombre a la variable $ continue y revertir sus roles si tiene más sentido para usted.

funciona más fácil si no tiene más instrucciones.

$exit = FALSE; 

if($bla): 
    $bla = get_bla(); 
    if(empty($bla)) $exit = TRUE; 
    if(!$exit)do($bla); 
endif; 
0

Estrictamente hablando, no podemos dejar if -bloque antes de tiempo, pero a veces es realmente necesario. break se puede usar solo dentro de los bucles y switch -block. Pero podemos colocar if en un bucle. Entonces, la respuesta de Marcos Fernández Ramos es probablemente la más adecuada. Aquí hay una variante ligeramente mejor.

do if() 
{ 
    ... 
    if() break; 
    ... 
} while (false); 
0

Prueba este

do { 

    if($bla) { 
     $bla = get_bla(); 

     if (empty($bla)) { 
      break; 
     } 

     do($bla); 
    } 

    /* You can do more comparisions here */ 

} while (0); 
0

Si realmente quiere una declaración de la que se puede break, se podría utilizar una instrucción while:

while ($bla) { 
    $bla = get_bla(); 

    if (!$bla) { 
     break; 
    } 

    do($bla); 

    // Maybe some more code... 

    // Do not forget to break out of the while loop! 
    break; 
} 

Esta es una buena manera de evitar que muchos declaraciones anidadas if (que pueden evitarse en muchos casos), pero tenga cuidado con break el ciclo.

0

si su condición es una prueba en contra de una sola variable, entonces la instrucción switch es una solución mucho mejor y se puede fácilmente romper:

switch ($var_to_check) { // equivalent to if ($var_to_check==$value_against) 
    case $value_against: 
     ... 
     if ($something_wrong) { break; } // early exit from if 
     ... 
     break; // regular break 
    default: // equivalent to else 
     ... 
} // end of switch (or if) 
... // after the tests 

sólo funciona para los controles de ensayo individuales. Tiene la ventaja de manejar un montón de ifs.