ternario - sentencia if en php
Cualquier forma de romper la declaración if en PHP? (20)
¿Hay algún comando en PHP para detener la ejecución de la instrucción if
actual o principal, igual que break
o break(1)
para switch
/ loop
? Por ejemplo
$arr=array(''a'',''b'');
foreach($arr as $val)
{
break;
echo "test";
}
echo "finish";
en el código anterior PHP no hará echo "test";
e irá a echo "finish";
Necesito esto para si
$a="test";
if("test"==$a)
{
break;
echo "yes"; // I don''t want this line or lines after to be executed, without using another if
}
echo "finish";
Quiero break
la instrucción if
anterior y dejar de ejecutar el echo "yes";
o códigos que ya no son necesarios para ser ejecutados, puede haber o no una condición adicional, ¿hay forma de hacerlo?
existe GOTO
if(smth) {
.....
.....
.....
.....
.....
goto Area1;
.....
.....
}
Area1:
....your code here....
Sin embargo, recuerde goto
es una práctica muy recomendable.
¿Qué hay de usar un operador ternario?
<?php
// Example usage for: Ternary Operator
$action = (empty($_POST[''action''])) ? ''default'' : $_POST[''action''];
?>
Que es idéntico a esta declaración if / else:
<?php
if (empty($_POST[''action''])) {
$action = ''default'';
} else {
$action = $_POST[''action''];
}
?>
Como puedes salir de un ciclo do / while, déjanos " hacer " una ronda. Con un tiempo (falso) al final, la condición nunca es verdadera y no se repetirá, nuevamente.
do
{
$subjectText = trim(filter_input(INPUT_POST, ''subject''));
if(!$subjectText)
{
$smallInfo = ''Please give a subject.'';
break;
}
$messageText = trim(filter_input(INPUT_POST, ''message''));
if(!$messageText)
{
$smallInfo = ''Please supply a message.'';
break;
}
} while(false);
Encapsula tu código en una función. Puede detener la ejecución de una función con return
en cualquier momento.
La respuesta simple es que no, no hay una forma de salirse de una sentencia if
sin detener completamente la ejecución (a través de la exit
). Otras soluciones no funcionarán para mí porque no puedo cambiar la estructura de la instrucción if
, ya que estoy inyectando código en un complemento, así:
if ( condition ) {
// Code and variables I want to use
// Code I have control over
// Code I don''t want to run
}
// More code I want to use
La solución simple es comentarlo.
$a="test";
if("test"==$a)
{
//echo "yes"; //no longer needed - 7/7/2014 - updateded bla bla to do foo
}
El beneficio adicional es que no cambia el código original y puede fecharlo, ponerlo en su lugar y explicar por qué.
Por qué el voto hacia abajo, de acuerdo con la solicitud OP, creo que esta es una solución perfectamente válida.
"Quiero [romper la instrucción if anterior y] dejar de ejecutar el eco" yes "; o los códigos que ya no son necesarios para ser ejecutados, puede haber o no una condición adicional, ¿hay forma de hacer esto?"
De hecho, alguien podría ver algunas de las otras soluciones, un año más tarde y preguntarse qué está pasando allí. Según mi sugerencia, uno podría dejar una buena documentación para futuras referencias, que siempre es una buena práctica.
Llego tarde a la fiesta pero quería contribuir. Me sorprende que nadie sugirió exit()
. Es bueno para las pruebas. Lo uso todo el tiempo y funciona como encanto.
$a ='''';
$b ='''';
if($a == $b){
echo ''Clark Kent is Superman'';
exit();
echo ''Clark Kent was never Superman'';
}
El código se detendrá en exit()
y todo lo que sigue no se ejecutará.
Resultado
Clark Kent is Superman
Funciona con foreach()
y while()
también. Funciona en cualquier lugar donde lo coloques realmente.
foreach($arr as $val)
{
exit();
echo "test";
}
echo "finish";
Resultado
nothing gets printed here.
Úselo con un forloop()
for ($x = 2; $x < 12; $x++) {
echo "Gru has $x minions <br>";
if($x == 4){
exit();
}
}
Resultado
Gru has 2 minions
Gru has 3 minions
Gru has 4 minions
En un escenario de caso normal
$a =''Make hot chocolate great again!'';
echo $a;
exit();
$b = ''I eat chocolate and make Charlie at the Factory pay for it.'';
Resultado
Make hot chocolate great again!
Me encuentro con el mismo problema, y me gusta a continuación:
$a=1;
switch($a) {
case "1":
if ($coniditon1){
break;
}
if ($coniditon2){
break;
}
if ($coniditon3){
break;
}
}
De esta manera obtuve lo que quiero. Yo uso un interruptor solo tiene un caso definido y luego uso un descanso en caso de que elija la condición. La razón por la que uso break: condition1 y conditon2 puede satisfacer ambos, en esa situación solo se aplica condition1 .IF es selectivo según el orden.
No se preocupe por los comentarios de otros usuarios, puedo entenderlo, A VECES cuando se requieren estas cosas "sofisticadas" . Si podemos romper un if, no será necesario un montón de if anidados, lo que hará que el código sea mucho más limpio y estético.
Este código de ejemplo ilustra que CERTAINS SITUATIONS donde se viola si puede ser mucho más adecuado que una gran cantidad de feeds anidados ... si no se ha enfrentado a esa situación determinada no significa que no existe .
Código feo
if(process_x()) {
/* do a lot of other things */
if(process_y()) {
/* do a lot of other things */
if(process_z()) {
/* do a lot of other things */
/* SUCCESS */
}
else {
clean_all_processes();
}
}
else {
clean_all_processes();
}
}
else {
clean_all_processes();
}
Buen código
do {
if( !process_x() )
{ clean_all_processes(); break; }
/* do a lot of other things */
if( !process_y() )
{ clean_all_processes(); break; }
/* do a lot of other things */
if( !process_z() )
{ clean_all_processes(); break; }
/* do a lot of other things */
/* SUCCESS */
} while (0);
Como dice @NiematojakTomasz, el uso de goto
es una alternativa, lo malo de esto es que siempre necesitas definir la etiqueta (objetivo del punto).
No, no hay forma de "romper" un bloque si como lo haría dentro de los bucles. :(
¡Así que convierte tu prueba en un switch
!
Me pregunto por qué nadie te alentó a utilizar la declaración de cambio desde (incluso si no has tenido muchos casos de prueba)
¿Crees que es demasiado detallado?
Definitivamente iría por eso aquí
switch($a){
case ''test'':
# do stuff here ...
if(/* Reason why you may break */){
break; # this will prevent executing "echo ''yes'';" statement
}
echo ''yes''; # ...
break; # As one may already know, we might always have to break at the end of case to prevent executing following cases instructions.
# default:
# something else here ..
# break;
}
Para mí, las excepciones están destinadas a generar errores y no a controlar el error de ejecución.
Si el comportamiento de interrupción que intenta establecer no se trata de errores inesperados, el manejo de excepciones no es la solución correcta aquí :/
.
No.
Pero ¿qué tal?
$a="test";
if("test"==$a)
{
if ($someOtherCondition)
{
echo "yes";
}
}
echo "finish";
Para detener por completo el resto del script, puede hacer
salida; // En lugar de descanso. El resto del código no se ejecutará
Puede usar un do-while (falso):
<?php
do if ($foo)
{
// Do something first...
// Shall we continue with this block, or exit now?
if ($abort_if_block) break;
// Continue doing something...
} while (false);
?>
como se describe en http://php.net/manual/en/control-structures.if.php#90073
Respondiendo a su pregunta si eso es factible o no, entonces sí que se puede lograr usando el operador "goto" de php.
Pero, desde el punto de vista ético, no es una buena práctica usar "goto" y existe la necesidad de usar goto, entonces esto significa que el código debe reconstruirse para poder eliminar el requisito de goto.
De acuerdo con el código de muestra que publicó anteriormente, se puede ver claramente que el código puede reconstruirse y que el código que ya no es necesario puede eliminarse o comentarse (si existe la posibilidad de utilizarlo en el futuro).
Simplemente mueva el código que no se supone que debe ejecutarse a else/elseif
branch. Realmente no veo por qué querrías hacer lo que intentas hacer.
Tengo una solución simple sin muchos cambios. la declaración inicial es
Quiero romper la instrucción if anterior y dejar de ejecutar el eco "sí"; o códigos que ya no son necesarios para ser ejecutados, puede haber o no una condición adicional, ¿hay forma de hacerlo?
entonces, parece simple. prueba un código como este.
$a="test";
if("test"==$a)
{
if (1==0){
echo "yes"; // this line while never be executed.
// and can be reexecuted simply by changing if (1==0) to if (1==1)
}
}
echo "finish";
si quieres probar sin este código, es simple. y puedes regresar cuando quieras. otra solución es bloques de comentarios. o simplemente piense e intente con otro código separado y copie y pegue solo el resultado en su código final. y si un código ya no es necesario, en su caso, el resultado puede ser
$a="test";
echo "finish";
con este código, la declaración original es completamente respetada ... :) ¡y más legible!
forma correcta de hacer esto:
try{
if( !process_x() ){
throw new Exception(''process_x failed'');
}
/* do a lot of other things */
if( !process_y() ){
throw new Exception(''process_y failed'');
}
/* do a lot of other things */
if( !process_z() ){
throw new Exception(''process_z failed'');
}
/* do a lot of other things */
/* SUCCESS */
}catch(Exception $ex){
clean_all_processes();
}
Después de leer algunos de los comentarios, me di cuenta de que el manejo de excepciones no siempre tiene sentido para el control de flujo normal. Para un flujo de control normal, es mejor usar "If else":
try{
if( process_x() && process_y() && process_z() ) {
// all processes successful
// do something
} else {
//one of the processes failed
clean_all_processes();
}
}catch(Exception ex){
// one of the processes raised an exception
clean_all_processes();
}
También puede guardar los valores de retorno del proceso en variables y luego verificar en los bloques de falla / excepción qué proceso ha fallado.
goto :
El operador goto se puede usar para saltar a otra sección en el programa. El punto de destino se especifica mediante una etiqueta seguida de dos puntos, y la instrucción se da como goto seguido de la etiqueta de destino deseada. Esto no es un goto completo sin restricciones. La etiqueta de destino debe estar dentro del mismo archivo y contexto, lo que significa que no puede saltar de una función o método, ni puede saltar a uno. Tampoco puedes saltar a ningún tipo de circuito o estructura de conmutación. Puede saltar de estos, y un uso común es usar un goto en lugar de un salto de varios niveles ...
$a="test";
if("test"!=$a)
{
echo "yes";
}
else
{
echo "finish";
}
$arr=array(''test'',''go for it'');
$a=''test'';
foreach($arr as $val){
$output = ''test'';
if($val === $a) $output = "";
echo $output;
}
echo "finish";
combinando sus declaraciones, creo que esto le daría el resultado deseado. limpio y simple, sin tener demasiadas declaraciones.
para el código feo y bueno, mi recomendación sería:
function myfunction(){
if( !process_x() || !process_y() || !process_z()) {
clean_all_processes();
return;
}
/*do all the stuff you need to do*/
}
en algún lugar de tu código normal
myfunction();