note 47252 added to control-structures.else

From: 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

« previous php.notes (#80294) next »