Re: enhanced foreach loops
boots <[email protected]> Thu, 16 Nov 2006 13:09:03 -0800 (PST)
| Newsgroups | gmane.comp.php.smarty.devel |
|---|---|
| Message-ID | <[email protected]> |
Kerry Wilson <[email protected]> wrote: Kerry Wilson wrote: > I would like to enhance the foreach loop by adding next and previous > to the foreach variables. > > Example usage: > > {foreach from=$message.backtrace item='call' name='backtrace'} > {assign var='previous_call' value=|$smarty.foreach.backtrace.next}| > {$call.file} [{$call.line}] - > {$previous_call.class}.{$previous_call.function}(){/if} > {/foreach} > > In case you cannot tell I am using this to print a backtrace ( I want > it to show the method it is currently in, not the one that it is > calling ). > > Where does the foreach implementation reside in source? And is this a > good thing to add to the base code? > Here is the code for the feature enhancement, it goes in Smarty_Compiler.class.php around line 1185. $output .= "if ({$foreach_props}['total'] > 0):\n"; $output .= " \$_values = array_values(\$_from);\n"; $output .= " foreach (\$_from as $key_part\$this->_tpl_vars['$item']):\n"; $output .= " if( isset( \$_values[{$foreach_props}['iteration']-1] ) ) { {$foreach_props}['prev'] = \$_values[{$foreach_props}['iteration']-1]; } else { {$foreach_props}['prev'] = false; }\n"; $output .= " if( isset( \$_values[{$foreach_props}['iteration']+1] ) ) { {$foreach_props}['next'] = \$_values[{$foreach_props}['iteration']+1]; } else { {$foreach_props}['next'] = false; }\n"; $output .= " {$foreach_props}['iteration']++;\n"; It actually turned out to be cleaner than I expected. It would be great if this were added to the next release so my code doesn't break when I upgrade! kw Unfortunately, array_values() has memory implications and possibly severe performance implications for PHP5 iterator implementing objects; otherwise a nice solution, but I still think you should implement as a plugin. Maybe consider a compiler plugin for this one. boots --------------------------------- Sponsored Link Mortgage rates near 39yr lows. $510,000 Mortgage for $1,698/mo - Calculate new house payment