在 Smarty 模板開發中,{foreach} 是遍歷陣列的主力工具。但許多開發者只會基本迴圈,對於「取得陣列長度」、「判斷首尾」、「限制輸出筆數」等進階控制不夠熟悉。本文整理實用屬性與控制技巧,助你寫出更彈性的模板邏輯。
在 {foreach} 區塊內,透過 $smarty.foreach.名稱.屬性 存取:
| 屬性 | 說明 | 型別/範例 |
|---|---|---|
index | 當前元素索引(從 0 起算) | int |
iteration | 當前迴圈次數(從 1 起算) | int |
first | 是否為第一次迴圈 | bool |
last | 是否為最後一次迴圈 | bool |
show | 是否會顯示內容(受 {foreachelse} 影響) | bool |
total | 總迴圈次數(陣列長度) | int |
{foreach from=$variable key=key name=loop item=value}
陣列長度:{$variable|@count}
索引(index):{$smarty.foreach.loop.index}
次數(iteration):{$smarty.foreach.loop.iteration}
首筆(first):{$smarty.foreach.loop.first}
尾筆(last):{$smarty.foreach.loop.last}
總數(total):{$smarty.foreach.loop.total}
{/foreach}
常見需求:「只顯示前 5 筆新聞」。兩種寫法任選:
index(從 0 起算){foreach name=infolist from=$VIDEO_INFO_LIST item=infolist}
{assign var=floor value=$smarty.foreach.infolist.index}
{if $floor < 5}
{$infolist}
{/if}
{/foreach}
iteration(從 1 起算,更直觀){foreach name=infolist from=$VIDEO_INFO_LIST item=infolist}
{if $smarty.foreach.infolist.iteration <= 5}
{$infolist}
{/if}
{/foreach}
不進入迴圈也能取得長度:
{$myArray|@count}
@ 修飾符表示對整個陣列操作而非單一元素。
name 屬性命名迴圈,避免巢狀迴圈變數衝突。iteration,語意更清晰。array_slice 再傳給模板,效能更佳。