这几天,我在用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>
同志们,简单吧,哈哈哈……我明白了,你们呢?
有不明白的童鞋,可能给我发邮件或者留言,我的邮箱是:[email protected]