改进前序遍历 输出

h420943302 2012-11-06 05:13:26
现在有一个无限分级系统 利用 前序遍历 的数据表 字段 id name lft rgt nlevel
在thinkphp框架下 怎么才能实现 遍历输出


...全文
308 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2012-11-07
  • 打赏
  • 举报
回复
引用 5 楼 h420943302 的回复:
xuzuning 没理解我的意思 图一才是我想实现的效果 图二只是 说 这个无线分类的 解释 现在有个 数据表 是根据图二 储存的 我想把它遍历出来 但不是简单遍历 如 图一 所示 使他们的子类别放在相对应父类下面 并且缩进两格
嗯,是我理解错了
$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
amani11 2012-11-07
  • 打赏
  • 举报
回复
预排序遍历树 这不是很简单吗? SELECT …… lft BETWEEN (… AND …) ORDER BY lft ASC between范围,就是某个节点的左右值。。而你的字段nlevel【与某个节点nlevel的差】就是缩进长度 这种结构,找出树结构非常容易。。也就为了解决这种需求而产生的 但是改变父子关系、插入数据会麻烦一些。。。。
mu_rain 2012-11-07
  • 打赏
  • 举报
回复
这玩意,我们真做过,还是oa 工作流的代码,基于工作流生成图结构图表,至今仍在后怕,当给一个人扯淡的空间时,技术是完全跟不上的,哪怕我们认为我们做得很好了,哪怕我们努力的解决了一个又一个的问题,反复的重构了多次。在扯淡的人面前,技术是供人玩弄的。。。。
gfrkddf001 2012-11-07
  • 打赏
  • 举报
回复
win2003 sp2 拒绝访问 解决方法win2003 sp2 拒绝访问 解决方法win2003 sp2 拒绝访问 解决方法
h420943302 2012-11-07
  • 打赏
  • 举报
回复
xuzuning 没理解我的意思 图一才是我想实现的效果 图二只是 说 这个无线分类的 解释 现在有个 数据表 是根据图二 储存的 我想把它遍历出来 但不是简单遍历 如 图一 所示 使他们的子类别放在相对应父类下面 并且缩进两格
h420943302 2012-11-07
  • 打赏
  • 举报
回复


谢谢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 />';
}
?>
amani11 2012-11-07
  • 打赏
  • 举报
回复
既然存在数据库,你别的方式不要通过数据库查询吗? 那一条SQL语句,直接将树结构搜出来了。。。。否则为啥叫“预排序”呢?
h420943302 2012-11-07
  • 打赏
  • 举报
回复
说错了 不是 mu_rain 是 amani11
h420943302 2012-11-07
  • 打赏
  • 举报
回复
现在在看xuzuning的代码 我先说一下 mu_rain 你没理解清除意思 我要的是遍历 你总不能一个个写那个sql语句吧
acabin 2012-11-06
  • 打赏
  • 举报
回复
在这个框架下的实现和在其他框架下的实现最多就差个查询语句………… 你在csdn里面搜索一下左右值无限分类,有很多参考的
xuzuning 2012-11-06
  • 打赏
  • 举报
回复
你是要用程序画出那个图? 功夫有点大,且没有使用价值
h420943302 2012-11-06
  • 打赏
  • 举报
回复
和thinkphp没什么关系 我只是希望 回答的大神能在这个框架下实现 然后 遍历结果是要 实现图一的效果 简而言之 就是 子节点要在父节点底下 而不是简单的遍历
acabin 2012-11-06
  • 打赏
  • 举报
回复
直接遍历啊…… 这和thinkphp有啥关系……

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧