现在的位置: 首页 > 综合 > 正文

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

2013年09月01日 ⁄ 综合 ⁄ 共 3732字 ⁄ 字号 评论关闭

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

        


抱歉!评论已关闭.