Smarty 图标

您可根据商标声明使用 Smarty 的徽标。

Smarty Template Engine Smarty Template Engine

赞助、广告、新闻或其他查询,请联系:

使用 Smarty 的站点

广告

{foreach},{foreachelse}

{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} 的属性有 @index@iteration@first@last@show@total

  • {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' => '[email protected]');
$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: [email protected]</li>
</ul>

  

示例 7.32。使用嵌套 itemkey 的 {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}

  

上述示例假设结果包含名为 idname 的列。

迭代器与循环遍历普通旧数组相比有什么优势?对于数组而言,所有结果在被循环遍历之前都累积到内存中。对于迭代器而言,每个结果在循环内被加载/释放。这节省了处理时间和内存,特别适用于非常大的数据集。

@index

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

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

firstTRUE,如果当前 {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

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

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}


另请参见 {section}{for}{while}

{break}

{break} 中止数组迭代

示例 7.41. {break} 示例

 
  {$data = [1,2,3,4,5]}
  {foreach $data as $value}
    {if $value == 3}
      {* abort iterating the array *}
      {break}
    {/if}
    {$value}
  {/foreach}
  {*
    prints: 1 2
  *}
 
   

{continue}

{continue} 离开当前迭代并从下一次迭代开始。

示例 7.42. {continue} 示例

 
  {$data = [1,2,3,4,5]}
  {foreach $data as $value}
    {if $value == 3}
      {* skip this iteration *}
      {continue}
    {/if}
    {$value}
  {/foreach}
  {*
    prints: 1 2 4 5
  *}