Learning Ternary Operators — Tips & Tricks

By  on  

I started using ternary operator logic about six months ago and notice myself using shorthand if/else logic all the time. It shortens my code, the time to write it, and makes me look smarter to the mustaches.

Thanks to Google Analytics, I've found that I receive many page views from programmers looking for information on "shorthand if/else", "ternary logic", and "shorthand logic php". I've created a few guidelines for "?:" rookies to make learning shorthand if/else as quick and easy as it should be.

Start With If/Else, Then Convert To Ternary

Start with your expressions in simple if/else code, and then carefully convert each if/else into a shorter ternary statement. It may help to take the additional step of creating variables for each expression.

/* start with if / else ... */
if($language == 'php')
{
	$dynamic = true;
}
else
{
	$dynamic = false;
}

/* ... then convert */
$dynamic = ($language == 'php' ? true : false); //or 1 : 0

/* optional code shortening */
$dynamic = $language == 'php';

Use Parenthesis To Group Logic

Keeping your expressions in parentheses is a great way to keep your code organized for later maintenance.

//viva grouping!
$age_code = ($age > 10 ? ($age > 20 ? ($age > 30 ? 'senior' : 'adult') : 'teen') : 'youngster');

//the following isn't as fun to read
$age_code = $age > 10 ? $age > 20 ? $age > 30 ? 'senior' : 'adult' : 'teen' : 'youngster';

Use "Intermediate" Variables For Parts of the Expression

The above 10/20/30 code is rough and can be difficult to maintain. Using variables may help simplify things.

//better?
$over_30 = ($age > 30 ? 'senior' : 'adult');
$over_20 = ($age > 20 ? $over_30 : 'teen');
$age_code = ($age > 10 ? $over_20 : 'youngster');

Use True/False Boolean, Not Just The Expression

As you probably know, you can use JUST the expression as the return value. If you believe that will hurt you during the learning process, explicitly return true or false.

/* explicit */
$can_drive = ($age >= 16 ? true : false);

/* implicit, just the expression */
$can_drive = $age >= 16;

Know When Not To Use Ternary Logic

If there are many nested if/else statements in the logic, shorthand expressions may not be the best option. For example, the following snippet of code returns whether a given year is a leap year:

$is_leap_year = ((($year % 4) == 0) && ((($year % 100) != 0) || (($year %400) == 0)));

The above code works well for ternary logic because it wont have to be updated frequently -- the leap year "calculation" is always the same. If you have code that needs to be updated often, shorthand if/else may not be the optimal choice.

Test! Test! Test!

As with any type of programming, test early and often!

Recent Features

  • By
    Create a CSS Flipping Animation

    CSS animations are a lot of fun; the beauty of them is that through many simple properties, you can create anything from an elegant fade in to a WTF-Pixar-would-be-proud effect. One CSS effect somewhere in between is the CSS flip effect, whereby there's...

  • By
    Page Visibility API

    One event that's always been lacking within the document is a signal for when the user is looking at a given tab, or another tab. When does the user switch off our site to look at something else? When do they come back?

Incredible Demos

  • By
    MooTools Flashlight Effect

    Another reason that I love Twitter so much is that I'm able to check out what fellow developers think is interesting. Chris Coyier posted about a flashlight effect he found built with jQuery. While I agree with Chris that it's a little corny, it...

  • By
    CSS Text Overlap

    One of the important functions of CSS is to position elements. Margin, padding, top, left, right, bottom, position, and z-index are just a few of the major players in CSS positioning. By using the above spacing...

Discussion

  1. Thanks, I use a lot (probably unnecessary) if/else statements which could be cut down.

  2. Nice article! that’s something I wanted to learn/practice to save some time and clear my code when I have to use simple if/else, I’ll try to add this to my coding habits ;)

  3. The example with intermediate variables is interresting, but i’d better use a switch structure instead. What do you think?

    But thanks for the coding tips :)

  4. A switch could work there too Dagnan. Good point!

  5. TedInAK

    Nice write up! I used to use the parentheses the same as in your example:

    $dynamic = ($language == 'php' ? true : false);

    But was “mildly scolded” by a JS guru much smarter than I. He said it should be:

    $dynamic = ($language == 'php') ? true : false;

    Now technically, either way is “correct” since JS allows both ways. But I found myself agreeing with said guru, mainly that the logic test portion should be in the parentheses. Example:

    if ($language == 'php') {
      // code
    } else {
      // code
    }
    

    So to his way of thinking (and now mine), since in this structure it’s just the logical test that is within the parentheses, so should it be in the ternary structure.

  6. monster87

    Nice write up! I used to use the
    parentheses the same as in your
    example:

    $dynamic = ($language == ‘php’ ? true
    : false);

    But was “mildly scolded” by a JS guru
    much smarter than I. He said it should
    be:

    $dynamic = ($language == ‘php’) ? true
    : false;

    Now technically, either way is
    “correct” since JS allows both ways.
    But I found myself agreeing with said
    guru, mainly that the logic test
    portion should be in the parentheses.
    Example:

    if ($language == ‘php’) { // code }
    else { // code }

    Even simpler would be:

    $dynamic = $language == 'php' ? true : false;
    

    or even:

    $dynamic = $language == 'php';
    

    in JS this works the same way.

    And for anyone who is interested.
    Although it seems to miss in php, javascript does have an interesting even shorter expression for when working with if it’s false then use this default

    $somevar = $othervar ? $othervar : "default";
    
    $somevar = $othervar || "default";
    

    (in php $somevar will evaluate to ‘true’ since a filled string (“default”) is always ‘true’ in a or(||)-situation)

Wrap your code in <pre class="{language}"></pre> tags, link to a GitHub gist, JSFiddle fiddle, or CodePen pen to embed!