Dannylycka
Dannylycka

Reputation: 33

how to write single line if statement with multiple conditions?

I'm currently working on a foreach loop with nested if statements but I'm pretty sure there's a better way of writing these chunks of if statements.
I found this post: PHP if shorthand and echo in one line - possible?
Though this post is for single conditions, I would like to write mine in the same way(single lined).

I'm not that experienced in PHP myself so I'm sort of stuck on doing it the old fashioned way:

   if(($colorLevel['name'] === 'ATTR_VPMCV13') && ($colorLevel['level'] >= 80))
    {
        $prominentSideNumberArray[] = 10;
    }

   elseif(($colorLevel['name'] == 'ATTR_VPMCV13') && ($colorLevel['level'] >= 60) && ($colorLevel['level'] <= 70)){
        $prominentSideNumberArray[] = 8;
    }

If someone could properly explain what code to use where and why, that could really help me, and/or others, out. I've looked at the manual but I just can't figure out what to use where.

Upvotes: 2

Views: 11074

Answers (2)

B. Desai
B. Desai

Reputation: 16446

You can achieve this by using a ternary operator. Look at the following code:

$prominentSideNumberArray[] = ((($colorLevel['name'] === 'ATTR_VPMCV13') &&
 ($colorLevel['level'] >= 80) )? 10 : (($colorLevel['name'] == 'ATTR_VPMCV13') && 
($colorLevel['level'] >= 60) && ($colorLevel['level'] <= 70)?8:""))  ;

EDIT As per comments and you have to compare same value its better to define name

$color_name = "ATTR_VPMCV13";
if($colorLevel['name'] == $color_name )
    $prominentSideNumberArray[] = (($colorLevel['level'] >= 80)? 10 : (
($colorLevel['level'] >= 60) && ($colorLevel['level'] <= 70)?8:""))  ;

DEMO with different approach

EDIT

Keep in mind that this solution is less readable than if-else statement.

Upvotes: 0

axiac
axiac

Reputation: 72266

There is no such thing like an "if shorthand".
?: is an operator, if is a control structure. They are different language concepts that have different purposes and do different things. An expression that contains the ternary conditional operator (?:) can always be rewritten as two expressions and an if/else statement. The vice-versa is usually not possible.


The code you posted can be written to be much easier to read if you extract the common checking of $colorLevel['name'] into a separate if that includes the rest of the tests, extract $colorLevel['level'] into a new variable with shorter name and make the conditions that use $colorLevel['level'] use the same rule:

$level = $colorLevel['level'];
if ($colorLevel['name'] == 'ATTR_VPMCV13') {
    // Don't mix '<=' with '>=', always use '<='...
    if (60 <= $level && $level <= 70) {
        $prominentSideNumberArray[] = 8;
    // ... and put the intervals in ascending order
    } elseif (80 <= $level) {
        $prominentSideNumberArray[] = 10;
    }
}

If there are multiple if statements that verify different values of $colorLevel['name'] then the intention is more clear if you use a switch statement:

$level = $colorLevel['level'];
switch ($colorLevel['name'])
{
    case 'ATTR_VPMCV13':
        if (60 <= $level && $level <= 70) {
            $prominentSideNumberArray[] = 8;
        } elseif (80 <= $level) {
            $prominentSideNumberArray[] = 10;
        }
        break;

    case '...':
        // ...
        break;

    default:
        // ...
        break;
}

Upvotes: 3

Related Questions