Skip to the content...

Welcome to the David Walsh Blog. I'm a MooTools, Dojo, jQuery, CSS, and PHP Web Developer located in Madison, Wisconsin, United States. Please contact me if I can make your experience on my website better.

PHP Shorthand If/Else Using Ternary Operators (?:)

7 Responses »

An essential part of programming is evaluating conditions using if/else and switch/case statements. If / Else statements are easy to code and global to all languages. If / Else statements are great but they can be too long.

I preach a lot about using shorthand CSS and using MooTools to make JavaScript relatively shorthand, so I look towards PHP to do the same. If/Else statements aren't optimal (or necessary) in all situations. Enter ternary operators.

Ternary operator logic is the process of using "(condition) ? (true return value) : (false return value)" statements to shorten your if/else structures.

What Does Ternary Logic Look Like?

/* most basic usage */
$var = 5;
$var_is_greater_than_two = ($var > 2 ? true : false); // returns true

What Are The Advantages of Ternary Logic?

There are some valuable advantages to using this type of logic:

  • Makes coding simple if/else logic quicker
  • You can do your if/else logic inline with output instead of breaking your output building for if/else statements
  • Makes code shorter
  • Makes maintaining code quicker, easier
  • Job security?

Tips for Using Ternary Operators

Here are a few tips for when using "?:" logic:

  • Don't go more levels deep than what you feel comfortable with maintaining.
  • If you work in a team setting, make sure the other programmers understand the code.
  • PHP.net recommends avoiding stacking ternary operators. "Is [sic] is recommended that you avoid "stacking" ternary expressions. PHP's behaviour when using more than one ternary operator within a single statement is non-obvious."
  • If you aren't experienced with using ternary operators, write your code using if/else first, then translate the code into ?'s and :'s.
  • Use enough parenthesis to keep your code organized, but so many that you create "code soup."

More Sample Usage

Here are a couple more uses of ternary operators, ranging from simple to advanced:

 /* another basic usage */

$message = 'Hello '.($user->is_logged_in() ? $user->get('first_name') : 'Guest');
 /* echo, inline */

echo 'Based on your score, you are a ',($score > 10 ? 'genius' : 'nobody'); //harsh!
 /* a bit tougher */
$score = 10;
$age = 20;
echo 'Taking into account your age and score, you are: ',($age > 10 ? ($score < 80 ? 'behind' : 'above average') : ($score < 50 ? 'behind' : 'above average')); // returns 'You are behind'
 /* "thankfully-you-don't-need-to-maintain-this" level */
 $days = ($month == 2 ? ($year % 4 ? 28 : ($year % 100 ? 29 : ($year %400 ? 28 : 29))) : (($month - 1) % 7 % 2 ? 30 : 31)); //returns days in the given month

To learn more about ternary operators and usage, visit PHP.net Comparison Operators.

Discussion

  1. April 30, 2008 @ 11:06 am

    Nice job clarifying this! I keep forgetting the exact syntax for some reason…

  2. January 5, 2009 @ 3:20 pm

    Your second echo example in the more examples is missing the first ‘e’ in the code.

  3. mikkel lund
    February 13, 2009 @ 5:10 pm

    Nice article. I use this all the time. Often if/else statements get way too complicated. I love to shorten code and the (?:) operator helps a lot. It’s even a lot better when you can shorten it more than a (?:) can do: Yesterday I saw this excample in a high-end PHP OOP book:

    if ($condition){
    return true;
    }
    else {
    return false
    }

    It’s a lot easier to just use:

    return condition;

  4. February 16, 2009 @ 12:03 am

    I’ve been looking for a good explanation of this, thank you.

    Now I’m off to scour my code for opportunities to practice.

  5. October 9, 2009 @ 2:48 pm

    ohh wow man, i really needed this
    thanks for sharing that with such nice explanation

    thanks again

  6. richards
    June 23, 2010 @ 7:59 am

    What about (?:) ?
    I mean:

    “Since PHP 5.3, it is possible to leave out the middle part of the ternary operator. Expression expr1 ?: expr3 returns expr1 if expr1 evaluates to TRUE, and expr3 otherwise.”

    Could you give some explanation on using that one?

  7. June 24, 2010 @ 8:10 pm

    @Richard:

    If you have some experience with Javascript I would say that it is similar to:

    var test = result || error; //Javascript
    $test = $result ?: $error; //PHP

    In which it would return “result” value if it is not empty [1]. Otherwise it will return “error” value.

    I hope I was clear.

    [1] : For empty values see: http://www.php.net/manual/en/function.empty.php

Be Heard!

Share your thoughts with fellow developers of all skill levels! I want to hear from you!

Name*:
Email*:
Website:  
Wrap your code with <code> tags, f00!