Any way to break if statement in PHP?

Php

Php Problem Overview


Is there any command in PHP to stop executing the current or parent if statement, same as break or break(1) for switch/loop. For example

$arr=array('a','b');
foreach($arr as $val)
{
  break;
  echo "test";
}

echo "finish";

in the above code PHP will not do echo "test"; and will go to echo "finish";

I need this for if

$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";

I want to break the if statement above and stop executing echo "yes"; or such codes which are no longer necessary to be executed, there may be or may not be an additional condition, is there way to do this?

Update: Just 2 years after posting this question, I grew up, I learnt how code can be written in small chunks, why nested if's can be a code smell and how to avoid such problems in the first place by writing manageable, small functions.

Php Solutions


Solution 1 - Php

Don't worry about other users comments, I can understand you, SOMETIMES when developing this "fancy" things are required. If we can break an if, a lot of nested ifs won't be necessary, making the code much more clean and aesthetic.

This sample code illustrate that CERTAINS SITUATIONS where breaked if can be much more suitable than a lot of ugly nested ifs... if you haven't faced that certain situation does not mean it doesn't exists.

Ugly code

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();

}

Good looking code

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);

As @NiematojakTomasz says, the use of goto is an alternative, the bad thing about this is you always need to define the label (point target).

Solution 2 - Php

Encapsulate your code in a function. You can stop executing a function with return at any time.

Solution 3 - Php

proper way to do this :

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();
}

After reading some of the comments, I realized that exception handling doesn't always makes sense for normal flow control. For normal control flow it is better to use "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();
}

You can also save the process return values in variables and then check in the failure/exception blocks which process has failed.

Solution 4 - Php

Because you can break out of a do/while loop, let us "do" one round. With a while(false) at the end, the condition is never true and will not repeat, again.

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);

Solution 5 - Php

goto: > The goto operator can be used to jump to another section in the program. The target point is specified by a label followed by a colon, and the instruction is given as goto followed by the desired target label. This is not a full unrestricted goto. The target label must be within the same file and context, meaning that you cannot jump out of a function or method, nor can you jump into one. You also cannot jump into any sort of loop or switch structure. You may jump out of these, and a common use is to use a goto in place of a multi-level break...

Solution 6 - Php

There exist command: goto

if(smth) {
   .....
   .....
   .....
   .....
   .....
   goto My123;
   .....
   .....


}



My123:
....your code here....

BUT REMEMBER! goto should not be ever used anywhere in real-world scripts, as it is a sign of poor code.

Solution 7 - Php

You could use a do-while(false):

	<?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);
	?>

as described in http://php.net/manual/en/control-structures.if.php#90073

Solution 8 - Php

No, there is no way to "break" an if block like you would inside loops.:(
So turn your test into a switch !

I wonder why nobody encouraged you to use switch statement since (even if you haven't to many test cases)
Do you think it's too verbose?

I would definitely go for it here

  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;
  }

To me Exceptions are meant to raise errors and not really to control execution flaw.
If the break behaviour you are trying to set is not about unexpected error(s), Exception handling is not the right solution here :/.

Solution 9 - Php

$a = 1;

switch($a) {

  case "1":

    if  ($condition1){
      break;
    }

    if  ($condition2){
      break;
    }

    if  ($condition3){
      break;
    }
}

In this way I got what I want. I use a switch only has a definite case and then use break in case to choose if condition. The reason why I use the break : condition1 and condition2 may both satisfy, in that situation only condition1 is applied .IF is selective according the order.

Solution 10 - Php

No.

But how about:

$a="test";
if("test"==$a)
{
  if ($someOtherCondition)
  {
    echo "yes";
  }
}
echo "finish";

Solution 11 - Php

Just move the code that is not supposed to be executed to else/elseif branch. I don't really see why would you want to do what you're trying to do.

Solution 12 - Php

The simple answer is that no, there isn't a way to break from an if statement without completely stopping the execution (via exit). Other solutions won't work for me because I can't change the structure of the if statement, since I'm injecting code into a plugin, like so:

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

Solution 13 - Php

I had the same problem. A solution is to pile if. The first example is simplistic but...

    $a="test";
    if("test"==$a)
    {
        do something
        //break; We remove from your example
        if(comparison) {
            echo "yes";
        }
    }
    echo "finish";

Or, you can use goto.

    $a="test";
    if("test"==$a)
    {
        do something
        goto the_end_of_your_func;
        echo "yes";
    }
    the_end_of_your_func:
    echo "finish";

Solution 14 - Php

Answering to your question whether that is achievable or not, then yes that is achievable using "goto" operator of php.

But ethically, its not a good practice to use "goto" and of there is any need to use goto then this means that code need to be reconstructed such that requirement of goto can be removed.

According to the sample code you posted above, it can be clearly seen that the code can be reconstructed and the code that is no more required can be either deleted or commented (if possibility is there for use in future).

Solution 15 - Php

$arr=array('test','go for it');
$a='test';
foreach($arr as $val){
  $output = 'test';
  if($val === $a) $output = "";
  echo $output;
}
echo "finish";

combining your statements, i think this would give you your wished result. clean and simple, without having too much statements.

for the ugly and good looking code, my recomandation would be:

function myfunction(){
  if( !process_x() || !process_y() || !process_z()) {
    clean_all_processes();  
    return; 
  }
/*do all the stuff you need to do*/
}

somewhere in your normal code

myfunction();

Solution 16 - Php

You could possibly put the if into a foreach a for, a while or a switch like this

Then break and continue statements will be available

foreach ([1] as $i) if ($condition) { // Breakable if
    //some code
    $a = "b";
    // Le break 
    break;
    // code below will not be executed
}
for ($i=0; $i < 1 ; $i++) if ($condition) { 
    //some code
    $a = "b";
    // Le break 
    break;
    // code below will not be executed
}

switch(0){ case 0: if($condition){

   //some code
   $a = "b";
   // Le break 
   break;
   // code below will not be executed

}}



while(!$a&&$a=1) if ($condition) {

   //some code
   $a = "b";
   // Le break 
   break;
   // code below will not be executed

}

Solution 17 - Php

i have a simple solution without lot of changes. the initial statement is

> I want to break the if statement above and stop executing echo "yes"; or such codes which are no longer necessary to be executed, there may be or may not be an additional condition, is there way to do this?

so, it seem simple. try code like this.

$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";

if you want to try without this code, it's simple. and you can back when you want. another solution is comment blocks. or simply thinking and try in another separated code and copy paste only the result in your final code. and if a code is no longer nescessary, in your case, the result can be

$a="test";
echo "finish";

with this code, the original statement is completely respected.. :) and more readable!

Solution 18 - Php

The simple solution is to comment it out.

$a="test";
if("test"==$a)
{

  //echo "yes"; //no longer needed - 7/7/2014 - updateded bla bla to do foo
}

The added benefit is your not changing your original code and you can date it, initial it and put a reason why.

Why the down vote, according to the OP request I think this is a perfectly valid solution.

"I want to [break the if statement above and] stop executing echo "yes"; or such codes which are no longer necessary to be executed, there may be or may not be an additional condition, is there way to do this?"

In fact someone could look at some of the other solutions, a year latter and wonder what is going on there. As per my suggestion, one could leave good documentation for future reference, which is always good practice.

Solution 19 - Php

What about using ternary operator?

<?php
 // Example usage for: Ternary Operator
 $action = (empty($_POST['action'])) ? 'default' : $_POST['action'];
?>

Which is identical to this if/else statement:

<?php
 if (empty($_POST['action'])) {
   $action = 'default';
 } else {
   $action = $_POST['action'];
 }
?>

Solution 20 - Php

To completely stop the rest of the script from running you can just do

exit; //In place of break. The rest of the code will not execute

Solution 21 - Php

I'm late to the party but I wanted to contribute. I'm surprised that nobody suggested exit(). It's good for testing. I use it all the time and works like charm.

$a ='';
$b ='';
if($a == $b){
echo 'Clark Kent is Superman';
exit();
echo 'Clark Kent was never Superman';
}

The code will stop at exit() and everything after will not run.

Result

Clark Kent is Superman

It works with foreach() and while() as well. It works anywhere you place it really.

foreach($arr as $val)
{
  exit();
  echo "test";
}

echo "finish";

Result

nothing gets printed here.

Use it with a forloop()

for ($x = 2; $x < 12; $x++) {
    echo "Gru has $x minions <br>";
    if($x == 4){
    exit();
    }
}

Result

Gru has 2 minions
Gru has 3 minions
Gru has 4 minions

In a normal case scenario

$a ='Make hot chocolate great again!';
echo $a;
exit();
$b = 'I eat chocolate and make Charlie at the Factory pay for it.';

Result

Make hot chocolate great again!

Solution 22 - Php

$a="test";
if("test"!=$a)
{
echo "yes";                   
}
 else
 {
  echo "finish";
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMuhammad UsmanView Question on Stackoverflow
Solution 1 - PhpAgelessEssenceView Answer on Stackoverflow
Solution 2 - PhpMaxim KrizhanovskyView Answer on Stackoverflow
Solution 3 - PhpRahul RanjanView Answer on Stackoverflow
Solution 4 - PhpMarkus ZellerView Answer on Stackoverflow
Solution 5 - PhpNiematojakTomaszView Answer on Stackoverflow
Solution 6 - PhpT.ToduaView Answer on Stackoverflow
Solution 7 - PhpUltraDEVVView Answer on Stackoverflow
Solution 8 - PhpStphaneView Answer on Stackoverflow
Solution 9 - Phpuser3530437View Answer on Stackoverflow
Solution 10 - PhpOliver CharlesworthView Answer on Stackoverflow
Solution 11 - PhpMchlView Answer on Stackoverflow
Solution 12 - PhpDavidView Answer on Stackoverflow
Solution 13 - PhpNilavView Answer on Stackoverflow
Solution 14 - PhpSandeep GargView Answer on Stackoverflow
Solution 15 - PhpArthur KielbasaView Answer on Stackoverflow
Solution 16 - PhpThomazPomView Answer on Stackoverflow
Solution 17 - Phpchristian audebertView Answer on Stackoverflow
Solution 18 - PhpArtisticPhoenixView Answer on Stackoverflow
Solution 19 - PhpMartin StoneView Answer on Stackoverflow
Solution 20 - Phpmark kasinaView Answer on Stackoverflow
Solution 21 - PhpBalloon FightView Answer on Stackoverflow
Solution 22 - PhpShanonView Answer on Stackoverflow