這幾天,我在用ThinkPHP來開發網站,但是感覺第一次使用不是很習慣,尤其是ThinkPHP的多重迴圈。但顯了網上的方法,感覺不是說得不明白,就是太單調了(用一堆代碼來堆)。所以,我結合我的使用方式,來寫一篇關於ThinkPHP的Volist多重迴圈的方法。
好了,不跟大家瞎說八道了,言歸正傳,去看看今天我要說的內容——讓 ThinkPHP 的 Volist 用最簡單的方式實現多重迴圈(至少能實現100重)。
我先給大家看一段代碼:
function MakeTree($pid) { $condition['father'] = $pid; $result = M('main')->where($condition)->order('order asc, id desc')->select(); if($result) { foreach($result as $n => $val) { $list[$n]['id'] = $val['id']; $list[$n]['name'] = $val['name']; $list[$n]['father'] = $val['father']; $list[$n]['order'] = $val['order']; $list[$n]['child'] = $this->_MakeSonTree($val['id']); } } return $list; } function _MakeSonTree($pid) { $condition['father'] = $pid; $result = M('main')->where($condition)->order('order asc, id desc')->select(); if($result) { foreach($result as $n => $val) { $list[$n]['id'] = $val['id']; $list[$n]['name'] = $val['name']; $list[$n]['father'] = $val['father']; $list[$n]['order'] = $val['order']; $list[$n]['grandchild'] = $this->_MakeColTree($val['id']); } } return $list; } function _MakeColTree($pid) { $condition['mainid'] = $pid; $result = M('news')->where($condition)->order('norder asc, id desc')->select(); if($result) { foreach($result as $n => $val) { $list[$n]['nid'] = $val['nid']; $list[$n]['title'] = $val['title']; $list[$n]['order'] = $val['norder']; $list[$n]['time'] = $val['time']; } } return $list; }
這個就是實現多重迴圈代碼,看起來是不是很亂。其實,你細細地看,就明白了,其實很簡單的。如果高興的話,直接進行修改,可以實現無限個迴圈,如果你的伺服器需要冒煙的話。
我把資料庫表給大家例出來,讓大家方便瞭解:
main表:
| 欄位 |
類型 |
關鍵字 |
備忘 |
| id |
int |
是 |
自增 |
| name |
varchar |
|
標題 |
| father |
int |
|
本表父欄位 |
| order |
int |
|
顯示順序 |
news表:
| 欄位 |
類型 |
關鍵字 |
備忘 |
| nid |
int |
是 |
自增 |
| title |
varchar |
|
標題 |
| mainid |
int |
|
main表中對應的id |
| norder |
int |
|
顯示順序 |
| time |
datetime |
|
時間 |
開始說說代碼。第一個函數“MakeTree($pid)”。這個函數是Volist多重迴圈PHP代碼中的入口函數。一切迴圈,都是從這個入口進來的。而變數 $pid 指得是資料庫中要查詢表的 id 值。可以從第二、三行代碼處看到:
$condition['father'] = $pid; //查詢條件,尋找一切父目錄為變數 $pid 值的記錄。$result = M('main')->where($condition)->order('order asc,id desc')->select(); 對錶 main 執行查詢操作。
之後,再製作一個多維陣列 $list,來儲存從表中查得的資料:
if($result) //查看是否有問題。尋找到了,就執行內部的,否則就拜拜。{foreach($result as $n => $val) //將尋找到的結果 $result 以資料的形式傳給變數 $val,將以 $n 為列標號。 { $list[$n]['id'] = $val['id']; $list[$n]['name'] = $val['name']; $list[$n]['father'] = $val['father']; $list[$n]['order'] = $val['order']; /* 這裡,我們製作了一個資料存放區區。嗯,其名為 $list,我們可以看出來一個形式,就是: $資料名[列名(可以是字元)]['相對應的欄位值'] = $val['資料庫中的欄位值']; 這個說明什麼呢。這上說明,Volist 的遊標就是和資料一個樣子。我們可以用資料來製作,只要符合這個形式就成。下面我們還能看到。這玩意用的地方太多了。 哦,我太聰明了。。。噢!呵呵呵…… */ //但是,這隻是第一重迴圈資料資訊。我們要多維。所以,我們要建立本迴圈的第二次迴圈。如果學過資料結構的話,這就好說了。這就如同鏈表一樣來連結資料。二重迴圈的入口寫法為: $list[$n]['child'] = $this->_MakeSonTree($val['id']); }}
第二重迴圈與第一重一樣。只不過,將第二重迴圈入口直接放到了一重迴圈的 $list[$n]['child'] 中。來作為指向二重迴圈的入口。這樣,當運行完本次一重迴圈後,你要執行二重迴圈,只用讀取當生的 $list[$n]['child'] 就成。如果執行二三四重,都是這樣。都在本重迴圈的最後,加一個相對應的接向入口。對照著函數“_MakeSonTree($pid)”,你能看得很明白。
而函數“_MakeColTree($pid)”要告訴我們的是,如果不是在同一個資料庫的情況下,你只用改變資料庫指向就成。比如,他是指向 news 表:
$result = M('news')->where($condition)->order('norder asc, id desc')->select();
如果總是在同一個表拆騰,你可以在下一重迴圈的入口處作一次迴圈。但要判斷一下執行多少下,以免死迴圈。
比如:
$list[$n]['child'] = $this->_MakeSonTree($val['Main_ID']);
可以改為:
for($i = 1; $i <= 1000; $i++) $list[$n]['child'] = $this->_MakeSonTree($val['Main_ID']);
但每一重迴圈函數最後,都別忘記加上一個傳回值,以把將建立的地址傳給入口儲存。不然,你會想,咦?為什麼不能顯示???
return $list;
二、綁定 Volist
$result = $this->MakeTree(21); //將main的入口id寫上去。$this->assign('list', $result); //綁定 Volist。
前端要顯示的話,你們就以這樣的方式來寫:
<volist name="list" id="vo" key="n"> <div id="tabs-{$n}"> <volist name="vo['child']" id="child"> <p><b>{$child.name}</b></p> <volist name="child['grandchild']" id="grand"> <p style="line-height: 23px;">{$grand.title}</p> </volist> <br /> </volist> </div></volist>
同志們,簡單吧,哈哈哈……我明白了,你們呢?
有不明白的童鞋,可能給我發郵件或者留言,我的郵箱是:yangzhencheng_001@163.com