smarty循環foreach,section實例詳解 張映 發表於 2010-07-09 分類目錄: smarty php裏面的數組或者對像均可以有for,foreach,while,list each來循環出來,smarty裏面也有這套方法,要否則php的數組對像數據,smarty就不知道怎麼把顯示出來。習慣的php裏面的for,foreach,while的用法,剛一開始的時候,smarty裏面循環數組總是忘,好記性不如爛筆頭,仍是把它記下來纔是最好的。下面定界變量符號,我就用默認的大括號了。 一,foreache,foreacheelse,/foreache方法 1,它是section 以外處理循環的另外一種方案(根據不一樣須要選擇不一樣的方案).用於處理簡單數組(數組中的元素的類型一致),它的格式比 section 簡單許多,缺點是隻能處理簡單數組. 2,foreach 必須和 /foreach 成對使用,且必須指定 from 和 item 屬性. 3,foreach能夠圈套不過name必須爲一 4,from 待循環數組的名稱,key數組下標,item當前處理元素的變量名稱,name該循環的名稱,用於訪問該循環 5,foreachelse 語句在 from 後面的數組對像沒有值的時候被執行. 二,section,sectionelse,/section方法 section 用於遍歷數組中的數據. section 標籤必須成對出現. 必須設置 name 和 loop 屬性. 名稱能夠是包含字母、數字和下劃線的任意組合. 能夠嵌套但必須保證嵌套的 name 惟一. 變量 loop (一般是數組)決定循環執行的次數. 當須要在 section 循環內輸出變量時,必須在變量後加上中括號包含着的 name 變量. sectionelse 當 loop 變量無值時被執行. section裏面能夠帶的參數以下 1,name單次循環的名稱,必須有的選項 2,loop循環的變量名稱,必須有的選項 3,start 循環開始的KEY值 ,默認是從第一個開始, 4,step設置循環的跳躍數,step=2將只遍歷下標爲0、二、4等的元素. 5,max循環的次數,默認爲1, 6,show是否是顯示該循環 從上面參數中咱們能夠看到,沒有提到下標,咱們常常會用到數組下標。可是smarty裏面帶的有. 下面的arrayname是section裏面的單次循環名稱 a,$smarty.section.arrayname.index 數組下標,根foreach 的key差很少 b,$smarty.section.arrayname.index_prev 上次循環的下標 根$smarty.section.arrayname.loop差很少 c,$smarty.section.arrayname.index_next 下次循環的下標 d,$smarty.section.arrayname.iteration 第幾回循環了 根rownum同樣 e,$smarty.section.arrayname.first 第一次循環 f,$smarty.section.arrayname.last 最後一次循環 g,$smarty.section.arrayname.show 循環是否顯示 h,$smarty.section.arrayname.total 總共循環了多少次 section獲得數組對像裏面的值 {section name=arrayname loop=$array} {$array[arrayname.index]} ,{$array[arrayname]}兩者是等價的,由起可見,有了上面的a-h是多麼的重要 三,應用舉例 1,一維數組 查看複製打印? array ( "0" => 'home', '1' => 'who', '2'=> 'tank', '3'=> 'what' ); $this->tpl->assign("onearray", $this->onearray); a),foreach來讀取 查看複製打印? {foreach from=$onearray kkey=k item=value } 一維key={$k} 一維value={$value} {foreachelse} nothing {/foreach} 顯示的結果是 一維key=0 一維value=home 一維key=1 一維value=who 一維key=2 一維value=tank 一維key=3 一維value=what b),section來讀取 查看複製打印? {section name=one loop=$onearray start=0 step=1} index={$smarty.section.one.index}, index_prev={$smarty.section.one.index_prev}, index_next={$smarty.section.one.index_next}, first={$smarty.section.one.first}, last={$smarty.section.one.last}, iteration ={$smarty.section.one.iteration}, total={$smarty.section.one.total}, value={$onearray[one]} {sectionelse} nothing {/section} 顯示的結果是 index=0, index_prev=-1, index_next=1, first=1, last=, iteration =1, total=4, value=home index=1, index_prev=0, index_next=2, first=, last=, iteration =2, total=4, value=who index=2, index_prev=1, index_next=3, first=, last=, iteration =3, total=4, value=tank index=3, index_prev=2, index_next=4, first=, last=1, iteration =4, total=4, value=what 2,二維數組 查看複製打印? array ( "test" => 'home', '2' => 'who', array ( "上海", "born" => "安徽", "name" => "海底蒼鷹" ), array ( "1583456", "fax" => "12345678", "cell" => "13256478414" ) ); $this->tpl->assign("twoarray", $this->twoarray); a),foreach 查看複製打印? {foreach from=$twoarray kkey=k item=value } {if is_array($value)} {foreach from=$value key=tk item=tv } 二維tkey={$tk} 二維value={$tv} {foreachelse} 二維數組爲空 {/foreach} {else} 一維key={$k} 一維value={$value} {/if} {foreachelse} nothing {/foreach} 顯示結果以下: 一維key=test 一維value=home 一維key=2 一維value=who 二維tkey=0 二維value=上海 二維tkey=born 二維value=安徽 二維tkey=name 二維value=海底蒼鷹 二維tkey=0 二維value=1583456 二維tkey=fax 二維value=12345678 二維tkey=cell 二維value=13256478414 b),section 查看複製打印? {section loop=$twoarray name=two } {if is_array($twoarray[two])} {section loop=$twoarray[two] name=aaa } 二維tkey={$smarty.section.aaa.index} 二維value={$twoarray[two][aaa]} {sectionelse} 二維數組爲空 {/section} {else} 一維key={$smarty.section.two.index} 一維value={$twoarray[two]} {/if} {sectionelse} nothing {/section} 顯示結果以下: 一維key=0 一維value= 一維key=1 一維value= 一維key=2 一維value=who 二維tkey=0 二維value=上海 二維tkey=1 二維value= 二維tkey=2 二維value= 若是是一維數組,而且帶有下標的話,而且不是按0,1,2這樣的順序的話就取不到東西。這個能不能理解成foreach存在的理由。不過通常從數據庫取數據都是二維數組,而且外層都是以0開始的。看下面的這個例子 查看複製打印? array ( array ( 'name' => 'tank', 'sex' => '男', 'old' => '28' ), array ( 'name' => 'joyce', 'sex' => '女', 'old' => '111' ) ); section循環 查看複製打印? {section loop=$twoarray name=two} name={$twoarray[two].name},sex={$twoarray[two].sex},old={$twoarray[two].old} {sectionelse} nothing {/section} 顯示結果 name=tank,sex=男,old=28 name=joyce,sex=女,old=111