改进前序遍历 输出

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


...全文
318 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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,893

社区成员

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

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