batman
batman

Reputation:

Conditional operator with only true statement

I want to set a variable to a value, but only if a condition is true.
Instead of doing the following:

if($myarray["foo"]==$bar){  
    $variablename=$myarray["foo"];  
}  

This can end up being quite long if the variable names are long, or perhaps it involves arrays, when it's quite simple what I want to do — set a value if a condition is true.

I would like to use the conditional operator, something like this:

$variablename=($myarray["foo"]=="bar")? $myarray["foo"]......

But this fails because I don't want the variable to be set at all if the statement is false.

Basically, what I'm trying to do is make the first example shorter. Perhaps the conditional operator is not the way though...

Does anyone have any suggestions?

Upvotes: 6

Views: 11227

Answers (9)

luka_c
luka_c

Reputation: 36

Put != instead of == and ?: instead of just ?..

$variablename = ($myarray["foo"] != "bar") ?: $myarray["foo"];

is the same as

if($myarray["foo"] != "bar"){} else { $variablename = $myarray["foo"]; }

It might not be the smartest solution but it works. I like this one more

if($myarray["foo"] != "bar") {$variablename = $myarray["foo"]};

Upvotes: 2

Tom Haigh
Tom Haigh

Reputation: 57845

You could do this, but I wouldn't as it is pretty unreadable and stupid:

$myarray["foo"] == $bar ? $variablename = $myarray["foo"] : 0;

or

$myarray["foo"] == $bar && $variablename = $myarray["foo"];

Upvotes: 3

wlashell
wlashell

Reputation: 898

The "problem" you have isn't really a problem. Your example code is very clear and maintainable. I would really say leave it like it is.

You -could- remove the braces, but that will have an impact on maintainability.

Your other alternative is to create a set_if_true(mixed array, string key, boolean conditional) wrapper function. It hides what is really happening but depending on your specific implementation it is a good option. (For instance a configuration type object, or caching backend)

Upvotes: 2

chaos
chaos

Reputation: 124365

IMO, the best way to make your code sample shorter is:

if($myarray["foo"] == $bar)
    $variablename = $myarray["foo"];

FYI, the name of the operator you're asking about isn't "the ternary operator", it's the conditional operator.

Since you ask, a way you could actually use the conditional operator to do what you're asking is:

$myarray['foo'] == $bar ? $variablename = $myarray['foo'] : null;

but that's somewhat horrifically ugly and very unmaintainable.

Upvotes: 8

markh
markh

Reputation: 793

Ternary isn't the way, even though it can be written so that ternary works.

The reason is this: you're trying to use it in a way it's not intended, which will make your code awkward for other developers to read.

Upvotes: 0

gahooa
gahooa

Reputation: 137582

It doesn't get much shorter than:

if($condition) $var = $value;

Upvotes: 13

Sam Harwell
Sam Harwell

Reputation: 100029

You can put the original expression in the else part of the ternary operation, but if you want to guarantee single evaluation of the expression then you'll have to use a temporary variable and an if statement.

Upvotes: 0

ChrisLively
ChrisLively

Reputation: 88092

Your right, ternary is not the way to go. It's there to handle the if and else part of the statement.

Just stick with the regular if statement.

if($myarray["foo"]==$bar) $variablename=$myarray["foo"];

Upvotes: 2

Draemon
Draemon

Reputation: 34739

Set the variable to itself in the false case:

$variablename=($myarray["foo"]=="bar")? $myarray["foo"] : $variablename

Upvotes: 0

Related Questions