note 47252 added to control-structures.else
| From: | CalibanDarklock at osu1 dot php dot net | Date: | Mon, 08 Nov 2004 19:24:48 +0000 |
| Subject: | note 47252 added to control-structures.else | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-80294@lists.php.net to get a copy of this message | ||
If you're coming from another language that does not have the "elseif" construct
(e.g. C++), it's important to recognise that "else if" is a nested language construct
and "elseif" is a linear language construct; they may be compared in performance to a
recursive loop as opposed to an iterative loop.
<?php
$limit=1000;
for($idx=0;$idx<$limit;$idx++)
{ $list[]="if(false) echo \"$idx;\n\"; else"; }
$list[]=" echo \"$idx\n\";";
$space=implode(" ",$list);| // if ... else if ... else
$nospace=implode("",$list); // if ... elseif ... else
$start=array_sum(explode(" ",microtime()));
eval($space);
$end=array_sum(explode(" ",microtime()));
echo $end-$start . " seconds\n";
$start=array_sum(explode(" ",microtime()));
eval($nospace);
$end=array_sum(explode(" ",microtime()));
echo $end-$start . " seconds\n";
?>
This test should show that "elseif" executes in roughly two-thirds the time of "else
if". (Increasing $limit will also eventually cause a parser stack overflow error, but the level
where this happens is ridiculous in real world terms. Nobody normally nests if() blocks to more than
a thousand levels unless they're trying to break things, which is a whole different problem.)
There is still a need for "else if", as you may have additional code to be executed
unconditionally at some rung of the ladder; an "else if" construction allows this
unconditional code to be elegantly inserted before or after the entire rest of the process. Consider
the following elseif() ladder:
<?php
if($a) { conditional1(); }
elseif($b) { conditional2(); }
elseif($c) { conditional3(); }
elseif($d) { conditional4(); }
elseif($e) { conditional5(); }
elseif($f) { conditional6(); }
elseif($g) { conditional7(); }
elseif($h) { conditional8(); }
else { conditional9(); }
?>
To insert unconditional preprocessing code for $e onward, one need only split the
"elseif":
<?php
if($a) { conditional1(); }
elseif($b) { conditional2(); }
elseif($c) { conditional3(); }
elseif($d) { conditional4(); }
else {
....unconditional();
....if($e) { conditional5(); }
....elseif($f) { conditional6(); }
....elseif($g) { conditional7(); }
....elseif($h) { conditional8(); }
....else { conditional9(); }
}
?>
The alternative is to duplicate the unconditional code throughout the construct.
----
Manual Page -- http://www.php.net/manual/en/control-structures.else.php
Edit -- http://master.php.net/manage/user-notes.php?action=edit+47252
Delete -- http://master.php.net/manage/user-notes.php?action=delete+47252&report=yes
Reason: bad code -- http://master.php.net/manage/user-notes.php?action=delete+47252&report=yes&reason=bad+code
Reason: spam -- http://master.php.net/manage/user-notes.php?action=delete+47252&report=yes&reason=spam
Reason: useless example -- http://master.php.net/manage/user-notes.php?action=delete+47252&report=yes&reason=useless+example
Reason: contains commercial links -- http://master.php.net/manage/user-notes.php?action=delete+47252&report=yes&reason=contains+commercial+links
Reason: useless note -- http://master.php.net/manage/user-notes.php?action=delete+47252&report=yes&reason=useless+note
Reject -- http://master.php.net/manage/user-notes.php?action=reject+47252&report=yes
Search -- http://master.php.net/manage/user-notes.php