Smarty是什么?
为什么要使用?
用例和工作流程
语法对比
模板继承
最佳实践
快速入门
{foreach} 用于循环遍历数据数组。 {foreach} 具有比 {section} 循环更简单、更简洁的语法,并且还可以循环遍历关联数组。
{foreach $arrayvar as $itemvar}
{foreach $arrayvar as $keyvar=>$itemvar}
此 foreach 语法不接受任何已命名的属性。此语法在 Smarty 3 中是新的,但 Smarty 2.x 语法 {foreach from=$myarray key="mykey" item="myitem"} 仍受支持。
{foreach} 循环可以嵌套。
array 变量通常是值数组,它决定了 {foreach} 将循环的次数。您还可以传递一个整数以进行任意循环。
当 array 变量中没有值时,{foreachelse} 将被执行。
{foreach} 构造是 {break}、{continue}。
除了指定 key 变量,您还可以通过 {$item@key} 访问循环项的当前键(请参见以下示例)。
$var@property 语法对 Smarty 3 而言是新的,不过,当使用 Smarty 2 {foreach from=$myarray key="mykey" item="myitem"} 样式语法时,$smarty.foreach.name.property 语法仍然受支持。
虽然你可以使用语法 {foreach $myArray as $myKey => $myValue} 获取数组键,但在 foreach 循环内,键始终可用作 $myValue@key。
选项参数
| 名称 | 描述 |
|---|---|
| nocache | 禁用 {foreach} 循环的缓存 |
示例 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>
示例 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>
示例 7.32。使用嵌套 item 和 key 的 {foreach}
将一个数组分配给 Smarty,键包含每个循环值的关键。
<?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
示例 7.33。带有 {foreachelse} 的数据库示例
循环针对搜索结果的一个数据库 (PDO) 示例。此示例循环针对一个 PHP 迭代器,而不是一个数组 ()。
<?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 包含当前数组索引,从零开始。
示例 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 包含当前循环迭代,并且始终从一(1)开始,这与 index 不同。它在每次迭代时增量一(1)。
示例 7.35。iteration 示例:被除以
““被除以””操作符可以被用来检测特定的迭代。此处,我们对每 4 次迭代加粗显示姓名。
{foreach $myNames as $name}
{if $name@iteration is div by 4}
<b>{$name}</b>
{/if}
{$name}
{/foreach}
示例 7.36。iteration 示例:偶数/奇数迭代
““被偶数除””和““被奇数除””操作符可用于在特定次数的迭代内交替显示某项内容。选择偶数或奇数控制哪一项率先出现。此处,我们在每次 3 次迭代时切换字体颜色。
{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>
...
first 为 TRUE,如果当前 {foreach} 迭代为初始迭代。这里我们在第一次迭代中显示一个表格头行。
示例 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>
last 设置为 TRUE,如果当前 {foreach} 迭代为最终迭代。这里我们在最后一次迭代中显示一条水平线。
示例 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 show 属性可以在 {foreach} 循环执行后用来检测数据是否已被显示。 show 是一个布尔值。
示例 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} 将循环的迭代次数。这可以在 {foreach} 内部或之后使用。
示例 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}