ThinkPHP的Volist多重迴圈其實是這樣的。。。

來源:互聯網
上載者:User

        這幾天,我在用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

        

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.