Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Best way to do a PHP switch with multiple values per case?

How would you do this PHP switch statement?

Also note that these are much smaller versions, the 1 I need to create will have a lot more values added to it.

Version 1:

switch ($p) {      case 'home':      case '':          $current_home = 'current';     break;       case 'users.online':      case 'users.location':      case 'users.featured':      case 'users.new':      case 'users.browse':      case 'users.search':      case 'users.staff':          $current_users = 'current';     break;      case 'forum':          $current_forum = 'current';     break;  }  

Version 2:

switch ($p) {      case 'home':          $current_home = 'current';     break;       case 'users.online' || 'users.location' || 'users.featured' || 'users.browse' || 'users.search' || 'users.staff':          $current_users = 'current';     break;      case 'forum':          $current_forum = 'current';     break;  }  

UPDATE - Test Results

I ran some speed test on 10,000 iterations,

Time1: 0.0199389457703 // If statements
Time2: 0.0389049446106 //switch statements
Time3: 0.106977939606 // Arrays

like image 821
JasonDavis Avatar asked Aug 21 '09 01:08

JasonDavis


People also ask

Can case in switch statement have multiple values?

The switch can includes multiple cases where each case represents a particular value. Code under particular case will be executed when case value is equal to the return value of switch expression. If none of the cases match with switch expression value then the default case will be executed.

Is switch case faster than if PHP?

Due to the fact that "switch" does no comparison, it is slightly faster.

Can we write condition in switch case in PHP?

PHP doesn't support this syntax. Only scalar values allowed for cases.


1 Answers

For any situation where you have an unknown string and you need to figure out which of a bunch of other strings it matches up to, the only solution which doesn't get slower as you add more items is to use an array, but have all the possible strings as keys. So your switch can be replaced with the following:

// used for $current_home = 'current'; $group1 = array(         'home'  => True,         );  // used for $current_users = 'current'; $group2 = array(         'users.online'      => True,         'users.location'    => True,         'users.featured'    => True,         'users.new'         => True,         'users.browse'      => True,         'users.search'      => True,         'users.staff'       => True,         );  // used for $current_forum = 'current'; $group3 = array(         'forum'     => True,         );  if(isset($group1[$p]))     $current_home = 'current'; else if(isset($group2[$p]))     $current_users = 'current'; else if(isset($group3[$p]))     $current_forum = 'current'; else     user_error("\$p is invalid", E_USER_ERROR); 

This doesn't look as clean as a switch(), but it is the only fast solution which doesn't include writing a small library of functions and classes to keep it tidy. It is still very easy to add items to the arrays.

like image 151
too much php Avatar answered Sep 21 '22 03:09

too much php