W3Cschool
恭喜您成為首批注冊(cè)用戶(hù)
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
{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
是當(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
是當(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> ...
當(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>
當(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
屬性是在{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
是整個(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}
停止循環(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}
將跳過(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 *}
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話(huà):173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: