改进前序遍历 输出 现在有一个无限分级系统 利用 前序遍历 的数据表 字段 id name lft rgt nlevel在thinkphp框架下 怎么才能实现 遍历输出 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 直接遍历啊……这和thinkphp有啥关系…… 和thinkphp没什么关系 我只是希望 回答的大神能在这个框架下实现然后 遍历结果是要 实现图一的效果 简而言之 就是 子节点要在父节点底下 而不是简单的遍历 在这个框架下的实现和在其他框架下的实现最多就差个查询语句…………你在csdn里面搜索一下左右值无限分类,有很多参考的 xuzuning 没理解我的意思 图一才是我想实现的效果 图二只是 说 这个无线分类的 解释现在有个 数据表 是根据图二 储存的 我想把它遍历出来 但不是简单遍历 如 图一 所示 使他们的子类别放在相对应父类下面 并且缩进两格 win2003 sp2 拒绝访问 解决方法win2003 sp2 拒绝访问 解决方法win2003 sp2 拒绝访问 解决方法 预排序遍历树这不是很简单吗?SELECT …… lft BETWEEN (… AND …) ORDER BY lft ASCbetween范围,就是某个节点的左右值。。而你的字段nlevel【与某个节点nlevel的差】就是缩进长度这种结构,找出树结构非常容易。。也就为了解决这种需求而产生的但是改变父子关系、插入数据会麻烦一些。 嗯,是我理解错了$ar = array ( // 按 lft 升序获得的数组 array ( 'id' => '1', 'name' => 'Food', 'lft' => '1', 'rgt' => '18', 'nlevel' => '0', ), array ( 'id' => '2', 'name' => 'Fruit', 'lft' => '2', 'rgt' => '11', 'nlevel' => '0', ), array ( 'id' => '3', 'name' => 'Red', 'lft' => '3', 'rgt' => '6', 'nlevel' => '0', ), array ( 'id' => '4', 'name' => 'Cherry', 'lft' => '4', 'rgt' => '5', 'nlevel' => '0', ), array ( 'id' => '5', 'name' => 'Yellow', 'lft' => '7', 'rgt' => '10', 'nlevel' => '0', ), array ( 'id' => '6', 'name' => 'Banana', 'lft' => '8', 'rgt' => '9', 'nlevel' => '0', ), array ( 'id' => '7', 'name' => 'Meat', 'lft' => '12', 'rgt' => '17', 'nlevel' => '0', ), array ( 'id' => '8', 'name' => 'Beef', 'lft' => '13', 'rgt' => '14', 'nlevel' => '0', ), array ( 'id' => '9', 'name' => 'Pork', 'lft' => '15', 'rgt' => '16', 'nlevel' => '0', ),);function show_callback($val) { global $st; while(isset($st[0]) && $st[0] < $val['rgt']) { array_shift($st); } array_unshift($st, $val['rgt']); $val['child'] = ($val['rgt'] - $val['lft'] - 1) / 2; $val['space'] = str_repeat(' ', count($st) - 1); return $val;}$st = array();$ar = array_map('show_callback', $ar); //忽略nlevel的作用,自行计算缩进foreach($ar as $v) { echo $v['space'] . $v['name'] . '<br>';}Food Fruit Red Cherry Yellow Banana Meat Beef Pork 现在在看xuzuning的代码 我先说一下 mu_rain 你没理解清除意思 我要的是遍历 你总不能一个个写那个sql语句吧 说错了 不是 mu_rain 是 amani11 既然存在数据库,你别的方式不要通过数据库查询吗?那一条SQL语句,直接将树结构搜出来了。否则为啥叫“预排序”呢? 谢谢xuzing 对我的提醒 其实直接将从数据库查询出数据 然后按lft升序排列 这样子类别就肯定在相应父类别下面 然后在根据nlevel相应的缩进就可以 图一是数据表 图二是输出结果<?php$link=mysql_connect('localhost','root','123456') or die('不能连接'.mysql_error());$sql=mysql_query('use db_review',$link);$result=mysql_query("select * from wk_subcat order by lft",$link);while($ar=mysql_fetch_array($result)){for($i=0;$i<$ar['nlevel'];$i++) echo ' ';echo $ar['name'].'<br />';} ?> 怎样获取VPN的地址 关于HTML_Template_IT包 用php 把XML数据导入mysql mysql导出问题乱码问题~~~ 网站视频问题。 数据打印不显示????? 快一年没有到php版了,回来散分一下,祝大家圣诞快乐!! PHP如何下获得客户端操作系统和IE版本 请教诸位高手 怎么做这段程序??? 在win2000server下 php如何与sql server 进行连结 wamp5 如何多站点配置 PHp函数nl2br()换行问题
这和thinkphp有啥关系……
然后 遍历结果是要 实现图一的效果 简而言之 就是 子节点要在父节点底下 而不是简单的遍历
你在csdn里面搜索一下左右值无限分类,有很多参考的
图一才是我想实现的效果 图二只是 说 这个无线分类的 解释
现在有个 数据表 是根据图二 储存的 我想把它遍历出来 但不是简单遍历
如 图一 所示 使他们的子类别放在相对应父类下面 并且缩进两格
这种结构,找出树结构非常容易。。也就为了解决这种需求而产生的但是改变父子关系、插入数据会麻烦一些。
$ar = array ( // 按 lft 升序获得的数组
array ( 'id' => '1', 'name' => 'Food', 'lft' => '1', 'rgt' => '18', 'nlevel' => '0', ),
array ( 'id' => '2', 'name' => 'Fruit', 'lft' => '2', 'rgt' => '11', 'nlevel' => '0', ),
array ( 'id' => '3', 'name' => 'Red', 'lft' => '3', 'rgt' => '6', 'nlevel' => '0', ),
array ( 'id' => '4', 'name' => 'Cherry', 'lft' => '4', 'rgt' => '5', 'nlevel' => '0', ),
array ( 'id' => '5', 'name' => 'Yellow', 'lft' => '7', 'rgt' => '10', 'nlevel' => '0', ),
array ( 'id' => '6', 'name' => 'Banana', 'lft' => '8', 'rgt' => '9', 'nlevel' => '0', ),
array ( 'id' => '7', 'name' => 'Meat', 'lft' => '12', 'rgt' => '17', 'nlevel' => '0', ),
array ( 'id' => '8', 'name' => 'Beef', 'lft' => '13', 'rgt' => '14', 'nlevel' => '0', ),
array ( 'id' => '9', 'name' => 'Pork', 'lft' => '15', 'rgt' => '16', 'nlevel' => '0', ),
);function show_callback($val) {
global $st;
while(isset($st[0]) && $st[0] < $val['rgt']) {
array_shift($st);
}
array_unshift($st, $val['rgt']);
$val['child'] = ($val['rgt'] - $val['lft'] - 1) / 2;
$val['space'] = str_repeat(' ', count($st) - 1);
return $val;
}
$st = array();
$ar = array_map('show_callback', $ar); //忽略nlevel的作用,自行计算缩进foreach($ar as $v) {
echo $v['space'] . $v['name'] . '<br>';
}Food
Fruit
Red
Cherry
Yellow
Banana
Meat
Beef
Pork
我先说一下 mu_rain 你没理解清除意思 我要的是遍历 你总不能一个个写那个sql语句吧
其实直接将从数据库查询出数据 然后按lft升序排列 这样子类别就肯定在相应父类别下面 然后在根据nlevel相应的缩进就可以
图一是数据表 图二是输出结果
<?php
$link=mysql_connect('localhost','root','123456') or die('不能连接'.mysql_error());
$sql=mysql_query('use db_review',$link);$result=mysql_query("select * from wk_subcat order by lft",$link);
while($ar=mysql_fetch_array($result))
{
for($i=0;$i<$ar['nlevel'];$i++) echo ' ';
echo $ar['name'].'<br />';
}
?>