ThinkPHP的Volist多重循环其实是这样的。。。

来源:互联网 发布:2017淘宝客还能赚钱吗 编辑:程序博客网 时间:2024/04/28 10:08

        这几天,我在用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表:

字段类型关键字备注idint是自增namevarchar 标题fatherint 本表父字段orderint 显示顺序

news表:

字段类型关键字备注nidint是自增titlevarchar 标题mainidint main表中对应的idnorderint 显示顺序timedatetime 时间

         开始说说代码。第一个函数“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



        

	
				
		
原创粉丝点击