Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use ternary operator instead of if-else in PHP

I’m trying to shorten my code using the ternary operator.

This is my original code:

if ($type = "recent") {
    $OrderType = "sid DESC";
} elseif ($type = "pop") {
    $OrderType = "counter DESC";
} else {
    $OrderType = "RAND()";
}

How can I use the ternary operator in my code instead of ifs/elses?

$OrderType = ($type = "recent") ? "sid DESC" : "counter DESC" ;

This is the code I tried, but have no idea how to add an “elseif part” to it.

like image 539
Mac Taylor Avatar asked Apr 24 '10 15:04

Mac Taylor


2 Answers

This is called the ternary operator ;-)

You could use two of those :

$OrderType = ($type == 'recent' ? 'sid DESC' : ($type == 'pop' ? 'counter DESC' : 'RAND()'))

This can be read as :

  • if $type is 'recent'
  • then use 'sid DESC'
  • else
    • if $type is 'pop'
    • then use 'counter DESC'
    • else use 'RAND()'


A couple of notes :

  • You must use == or === ; and not =
    • The first two ones are comparison operators
    • The last one is the assignment operator
  • It's best to use (), to make things easier to read
    • And you shouldn't use too many ternary operators like that : it makes code a bit hard to understand, i think


And, as a reference about the ternary operator, quoting the Operators section of the PHP manual :

The third group is the ternary operator: ?:.
It should be used to select between two expressions depending on a third one, rather than to select two sentences or paths of execution.
Surrounding ternary expressions with parentheses is a very good idea.

like image 139
Pascal MARTIN Avatar answered Oct 21 '22 10:10

Pascal MARTIN


I'd suggest using a case statement instead. it makes it a little more readable but more maintainable for when you want to add extra options

switch ($type)
{
case "recent":
  $OrderType =  "sid DESC"; 
  break;
case "pop":
  $OrderType =  "counter DESC"; 
  break;
default:
   $OrderType =  "RAND()"; 
} 
like image 3
Mauro Avatar answered Oct 21 '22 09:10

Mauro