{foreach}
用于循环数组。
{foreach}
的语法比{section}
循环要更简单和清晰,并且可以使用非数字下标的数组。
{foreach $arrayvar as $itemvar}
{foreach $arrayvar as $keyvar=>$itemvar}
foreach的语法可以接受没有名称的属性,该语法是Smarty 3新增的。然而Smarty 2语法
{foreach from=$myarray key="mykey" item="myitem"}
也同样支持。
{foreach}
循环可以被嵌套使用.
array
变量,一般是数组的值,决定了{foreach}
循环的次数。你也可以传递一个任意的整数来控制循环次数。
如果array
数组变量中,没有值的情况下,
{foreachelse}
将执行。
{foreach}
的属性:
@index
,
@iteration
,
@first
,
@last
,
@show
,
@total
.
{foreach}
的语法命令:
{break}
,
{continue}
.
代替指定key
变量,你可以通过
{$item@key}
来使用循环的当前key。(见下面的例子).
$var@property
的语法是Smarty 3新增的。然而Smarty 2风格的语法{foreach from=$myarray key="mykey" item="myitem"}
, $smarty.foreach.name.property
也是支持的。
即使你在循环语法里{foreach $myArray as $myKey => $myValue}
已经指定了key的变量名,但循环体内$myValue@key
还是可用的。
可选标记:
名称 | 说明 |
---|---|
nocache | 关闭{foreach} 循环的缓存 |
Example 7.30. 简单的{foreach}
循环
<?php $arr = array('red', 'green', 'blue'); $smarty->assign('myColors', $arr); ?>
模板将顺序输出$myColors
。
<ul> {foreach $myColors as $color} <li>{$color}</li> {/foreach} </ul>
输出:
<ul> <li>red</li> <li>green</li> <li>blue</li> </ul>
Example 7.31. 使用key
变量的例子
<?php $people = array('fname' => 'John', 'lname' => 'Doe', 'email' => 'j.doe@example.com'); $smarty->assign('myPeople', $people); ?>
模板将以键值对的方式输出$myArray
<ul> {foreach $myPeople as $value} <li>{$value@key}: {$value}</li> {/foreach} </ul>
输出:
<ul> <li>fname: John</li> <li>lname: Doe</li> <li>email: j.doe@example.com</li> </ul>
Example 7.32. 多维数组通过item
和 key
来嵌套使用{foreach}
多维数组的键一般会对应另一个数组。
<?php $smarty->assign('contacts', array( array('phone' => '555-555-1234', 'fax' => '555-555-5678', 'cell' => '555-555-0357'), array('phone' => '800-555-4444', 'fax' => '800-555-3333', 'cell' => '800-555-2222') )); ?>
模板将输出$contact
.
{* key always available as a property *} {foreach $contacts as $contact} {foreach $contact as $value} {$value@key}: {$value} {/foreach} {/foreach} {* accessing key the PHP syntax alternate *} {foreach $contacts as $contact} {foreach $contact as $key => $value} {$key}: {$value} {/foreach} {/foreach}
上面两个例子都会输出:
phone: 555-555-1234 fax: 555-555-5678 cell: 555-555-0357 phone: 800-555-4444 fax: 800-555-3333 cell: 800-555-2222
Example 7.33. {foreachelse}的数据库例子
循环显示数据库(PDO)结果。例子是循环了一个PHP的迭代器(iterator)而不是一个数组(array)。
<?php include('Smarty.class.php'); $smarty = new Smarty; $dsn = 'mysql:host=localhost;dbname=test'; $login = 'test'; $passwd = 'test'; // setting PDO to use buffered queries in mysql is // important if you plan on using multiple result cursors // in the template. $db = new PDO($dsn, $login, $passwd, array( PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true)); $res = $db->prepare("select * from users"); $res->execute(); $res->setFetchMode(PDO::FETCH_LAZY); // assign to smarty $smarty->assign('res',$res); $smarty->display('index.tpl');?> ?>
{foreach $res as $r} {$r.id} {$r.name} {foreachelse} .. no results .. {/foreach}
上面的例子显示了查询结果id
和 name
两个字段的内容。
迭代器和数组循环哪个更高效呢?数组而言,每次循环之前全部的数组数据都会被先放到内存堆栈内,然后再进行循环。 而迭代器每次迭代循环时,都会载入并释放结果内容,这样可以节省运行时间和内存,尤其是当结果集非常大的时候。
index
是当前数组索引,从0开始计算。
Example 7.34. index
例子
{* output empty row on the 4th iteration (when index is 3) *} <table> {foreach $items as $i} {if $i@index eq 3} {* put empty table row *} <tr><td>nbsp;</td></tr> {/if} <tr><td>{$i.label}</td></tr> {/foreach} </table>
iteration
是当前循环的次数,和index
不同,iteration
是从1开始。
iteration
在每次循环的时候都会加一。
Example 7.35. iteration
例子: is div by
"is div by"运算可以对循环次数做一些特殊的判断。 下面我们将每4次循环就输出一次粗体的名称。
{foreach $myNames as $name} {if $name@iteration is div by 4} <b>{$name}</b> {/if} {$name} {/foreach}
Example 7.36. iteration
例子: is even/odd by
"is even by" 和 "is odd by"可以用于在循环中奇偶交替进行一些操作。在开始的时候可以选择奇或偶的循环。 下面是每三次循环会改变一次字体颜色。
{foreach $myNames as $name} {if $name@iteration is even by 3} <span style="color: #000">{$name}</span> {else} <span style="color: #eee">{$name}</span> {/if} {/foreach}
输出:
<span style="color: #000">...</span> <span style="color: #000">...</span> <span style="color: #000">...</span> <span style="color: #eee">...</span> <span style="color: #eee">...</span> <span style="color: #eee">...</span> <span style="color: #000">...</span> <span style="color: #000">...</span> <span style="color: #000">...</span> <span style="color: #eee">...</span> <span style="color: #eee">...</span> <span style="color: #eee">...</span> ...
当循环{foreach}
是首次循环时,first
将为TRUE
下面我们用first来显示一个表格的表头。
Example 7.37. first
例子
{* show table header at first iteration *} <table> {foreach $items as $i} {if $i@first} <tr> <th>key</td> <th>name</td> </tr> {/if} <tr> <td>{$i@key}</td> <td>{$i.name}</td> </tr> {/foreach} </table>
当{foreach}
循环到了最后一次时,
last
将为TRUE
。
下面我们将在循环的最后插入一条水平线。
Example 7.38. last
例子
{* Add horizontal rule at end of list *} {foreach $items as $item} <a href="#{$item.id}">{$item.name}</a>{if $item@last}<hr>{else},{/if} {foreachelse} ... no items to loop ... {/foreach}
show
属性是在{foreach}
循环执行之后,
检测循环是否显示数据的判断。
show
是一个布尔值。
Example 7.39. show
例子
<ul> {foreach $myArray as $name} <li>{$name}</li> {/foreach} </ul> {if $name@show} do something here if the array contained data {/if}
total
是整个{foreach}
循环的次数。
total可以在{foreach}
内部,或者之后使用。
Example 7.40. total
例子
{* show number of rows at end *} {foreach $items as $item} {$item.name}<hr/> {if $item@last} <div id="total">{$item@total} items</div> {/if} {foreachelse} ... no items to loop ... {/foreach}