用户
 找回密码
 入住 CI 中国社区
搜索
查看: 3713|回复: 2
收起左侧

[已解决] 用CI怎么做个添加树形结构 急!!!!

[复制链接]
发表于 2010-6-8 16:24:04 | 显示全部楼层 |阅读模式
本帖最后由 zhanglei_0202 于 2010-7-1 11:15 编辑

怎么用CI做树形结构?例如:
北京----朝阳区-----四惠桥------具体地址
     -----丰台区-----看丹桥------具体地址
这些东西都是自己添加的!~
那位大侠帮帮忙!~~
发表于 2010-6-8 17:14:58 | 显示全部楼层
关于分类算法,通常有这么两种算法,在网上很流行的
1、毗邻目录模式(adjacency list model)
2、预排序遍历树算法(modified preorder tree traversal algorithm)
OK,这两种算法google一下马上一大堆结果,原文来自mysql官方网站
http://dev.mysql.com/tech-resources/articles/hierarchical-data.html
关于这两种算法的优劣网上都有评论,我在此提供一个我自己的小小实现方法,没有涉及到mysql数据库查询的
PHP复制代码
 
    function unlimitedSort()
    {
        $arrSort = array(
            array(1,0),
            array(2,0),
            array(3,0),
            array(4,2),
            array(5,2),
            array(6,3),
            array(7,3),
            array(8,6),
            array(9,6)
        );
        var_dump($this->_listToTree($arrSort,0));
    }
 
    protected function _listToTree($arrSort,$root)
    {
        $tree = array();
        $offset = 0;
        $this->_toPretree(&$arrSort,$root,&$tree,&$offset);
        return $tree;
    }
 
    protected function _toPretree(&$arrSort,$root,&$tree,&$offset)
    {
        $sub = $this->_getSubNode(&$arrSort,$root);
 
        if(!empty($sub))
        {
            $offset ++;
            $offsetChar = str_repeat('-',$offset-1);
            foreach($sub as $key => $val)
            {
                $tree[] = $offsetChar.$val;
                unset($sub[$key]);
                $this->_toPretree(&$arrSort,$val,&$tree,&$offset);
            }
            $offset --;
        }
        elseif(empty($arrSort) && $offset == 1 )
        {
            return $tree;
        }
    }
 
    protected function _getSubNode(&$arrSort,$parent)
    {
        $subNode = array();
        foreach($arrSort as $key => $node)
        {
            if($node[1] == $parent)
            {
                $subNode[] = $node[0];
                unset($arrSort[$key]);
            }
        }
 
        return $subNode;
    }
 
复制代码

上面是对第一种算法中数据结构的排序,$arrSort 是一个模拟数据表,当然在实现中首先需要获取数据到一个数组中,上面表示为集合{1,2{4,5},3{6{8,9},7}}。上面代码放在控制器中,运行unlimitedSort函数就可以看到结果,xdebug下生成的结果
HTML复制代码
 
array
  0 => string '1' (length=1)
  1 => string '2' (length=1)
  2 => string '-4' (length=2)
  3 => string '-5' (length=2)
  4 => string '3' (length=1)
  5 => string '-6' (length=2)
  6 => string '--8' (length=3)
  7 => string '--9' (length=3)
  8 => string '-7' (length=2)
 
复制代码
发表于 2013-5-22 01:26:20 | 显示全部楼层
不能搞成树形

本版积分规则