Smarty:foreach函數(shù)

2018-10-14 11:36 更新

本節(jié)包含以下函數(shù)
@index
@iteration
@first
@last
@show
@total
{break}
{continue}

{foreach},{foreachelse}

{foreach}用于循環(huán)數(shù)組。 {foreach}的語(yǔ)法比{section}循環(huán)要更簡(jiǎn)單和清晰,并且可以使用非數(shù)字下標(biāo)的數(shù)組。

{foreach $arrayvar as $itemvar}

{foreach $arrayvar as $keyvar=>$itemvar}

溫馨提示:

foreach的語(yǔ)法可以接受沒(méi)有名稱(chēng)的屬性,該語(yǔ)法是Smarty 3新增的。然而Smarty 2語(yǔ)法 {foreach from=$myarray key="mykey" item="myitem"}也同樣支持。

  • {foreach} 循環(huán)可以被嵌套使用.

  • array變量,一般是數(shù)組的值,決定了{foreach} 循環(huán)的次數(shù)。你也可以傳遞一個(gè)任意的整數(shù)來(lái)控制循環(huán)次數(shù)。

  • 如果array數(shù)組變量中,沒(méi)有值的情況下, {foreachelse}將執(zhí)行。

  • {foreach}的屬性: @index@iteration@first@last@show@total.

  • {foreach}的語(yǔ)法命令: {break}{continue}.

  • 代替指定key變量,你可以通過(guò) {$item@key}來(lái)使用循環(huán)的當(dāng)前key。(見(jiàn)下面的例子).

溫馨提示:

$var@property的語(yǔ)法是Smarty 3新增的。然而Smarty 2風(fēng)格的語(yǔ)法{foreach from=$myarray key="mykey" item="myitem"},$smarty.foreach.name.property也是支持的。

溫馨提示:

即使你在循環(huán)語(yǔ)法里{foreach $myArray as $myKey => $myValue} 已經(jīng)指定了key的變量名,但循環(huán)體內(nèi)$myValue@key還是可用的。

可選標(biāo)記:

名稱(chēng)說(shuō)明
nocache關(guān)閉{foreach}循環(huán)的緩存

Example 7.30. 簡(jiǎn)單的{foreach} 循環(huán)

<?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);
?>

模板將以鍵值對(duì)的方式輸出$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. 多維數(shù)組通過(guò)item 和 key來(lái)嵌套使用{foreach}

多維數(shù)組的鍵一般會(huì)對(duì)應(yīng)另一個(gè)數(shù)組。

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

上面兩個(gè)例子都會(huì)輸出:

  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}的數(shù)據(jù)庫(kù)例子

循環(huán)顯示數(shù)據(jù)庫(kù)(PDO)結(jié)果。例子是循環(huán)了一個(gè)PHP的迭代器(iterator)而不是一個(gè)數(shù)組(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}

上面的例子顯示了查詢(xún)結(jié)果id 和 name兩個(gè)字段的內(nèi)容。

迭代器和數(shù)組循環(huán)哪個(gè)更高效呢?數(shù)組而言,每次循環(huán)之前全部的數(shù)組數(shù)據(jù)都會(huì)被先放到內(nèi)存堆棧內(nèi),然后再進(jìn)行循環(huán)。 而迭代器每次迭代循環(huán)時(shí),都會(huì)載入并釋放結(jié)果內(nèi)容,這樣可以節(jié)省運(yùn)行時(shí)間和內(nèi)存,尤其是當(dāng)結(jié)果集非常大的時(shí)候。

@index

index是當(dāng)前數(shù)組索引,從0開(kāi)始計(jì)算。

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

iteration是當(dāng)前循環(huán)的次數(shù),和index不同,iteration是從1開(kāi)始。 iteration在每次循環(huán)的時(shí)候都會(huì)加一。

Example 7.35. iteration 例子: is div by

"is div by"運(yùn)算可以對(duì)循環(huán)次數(shù)做一些特殊的判斷。 下面我們將每4次循環(huán)就輸出一次粗體的名稱(chēng)。

{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"可以用于在循環(huán)中奇偶交替進(jìn)行一些操作。在開(kāi)始的時(shí)候可以選擇奇或偶的循環(huán)。 下面是每三次循環(huán)會(huì)改變一次字體顏色。

 
 {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

當(dāng)循環(huán){foreach}是首次循環(huán)時(shí),first將為TRUE 下面我們用first來(lái)顯示一個(gè)表格的表頭。

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>

@last

當(dāng){foreach}循環(huán)到了最后一次時(shí), last將為TRUE。 下面我們將在循環(huán)的最后插入一條水平線(xiàn)。

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

show屬性是在{foreach}循環(huán)執(zhí)行之后, 檢測(cè)循環(huán)是否顯示數(shù)據(jù)的判斷。 show是一個(gè)布爾值。

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

total是整個(gè){foreach}循環(huán)的次數(shù)。 total可以在{foreach}內(nèi)部,或者之后使用。

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}

參見(jiàn){section}{for} 和 {while}

{break}

{break}停止循環(huán)。

Example 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}將跳過(guò)當(dāng)前本次循環(huán)并進(jìn)入下一次循環(huán)。

Example 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
  *} 

以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)