首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > PHP >

读取树状数据的步骤

2013-02-24 
读取树状数据的方法读取树状数据的方法一般在读取用“邻接列表算法”组织的数据时,需要使用递归逐层读取或者

读取树状数据的方法
读取树状数据的方法
一般在读取用“邻接列表算法”组织的数据时,需要使用递归逐层读取
或者读取数据到数组,然后用递归或非递归的方法再行处理
这里介绍一种边读边生成“树状”数组的方法,希望对你有用

mysql_connect();

//测试数据
$sql =<<< SQL
select * from (
  select '1' as id, '0' as pid, 'Food' as title
  union all select '2', '1', 'Fruit'
  union all select '3', '2', 'Red'
  union all select '4', '3', 'Cherry'
  union all select '5', '2', 'Yellow'
  union all select '6', '5', 'Banana'
  union all select '7', '1', 'Meat'
  union all select '8', '7', 'Beef'
  union all select '9', '7', 'Pork'
  ) t
  order by pid, id
SQL;

$rs = mysql_query($sql);

$res = array(); //结果数组
$ind = array(); //索引数组
while($row = mysql_fetch_assoc($rs)) {
  list($id, $pid) = array_values($row); 
  $ind[$id] = $row;
  if(isset($ind[$pid])) $ind[$pid]['child'][$id] =& $ind[$id]; //构造索引
  if($pid == 0) $res[$id] =& $ind[$id]; //转存根节点组
}

echo '<xmp>' . print_r($res, 1);
Array
(
    [1] => Array
        (
            [id] => 1
            [pid] => 0
            [title] => Food
            [child] => Array
                (
                    [2] => Array
                        (
                            [id] => 2
                            [pid] => 1
                            [title] => Fruit
                            [child] => Array
                                (
                                    [3] => Array
                                        (


                                            [id] => 3
                                            [pid] => 2
                                            [title] => Red
                                            [child] => Array
                                                (
                                                    [4] => Array
                                                        (
                                                            [id] => 4
                                                            [pid] => 3
                                                            [title] => Cherry
                                                        )

                                                )

                                        )



                                    [5] => Array
                                        (
                                            [id] => 5
                                            [pid] => 2
                                            [title] => Yellow
                                            [child] => Array
                                                (
                                                    [6] => Array
                                                        (
                                                            [id] => 6
                                                            [pid] => 5
                                                            [title] => Banana
                                                        )



                                                )

                                        )

                                )

                        )

                    [7] => Array
                        (
                            [id] => 7
                            [pid] => 1
                            [title] => Meat
                            [child] => Array
                                (
                                    [8] => Array
                                        (
                                            [id] => 8
                                            [pid] => 7
                                            [title] => Beef
                                        )

                                    [9] => Array


                                        (
                                            [id] => 9
                                            [pid] => 7
                                            [title] => Pork
                                        )

                                )

                        )

                )

        )

)

[解决办法]
支持版主读取树状数据的步骤
[解决办法]
工作几年,一直用这用处理无限分类,这个类不是我写的,希望作者来认领,有时也要扩展一些方法。但基础方法已经足够了


class Tree
{
    public $data=array();
    public $cateArray=array();

    function Tree()
    {

    }
    function setNode ($id, $parent, $value)
    {
    $parent = $parent?$parent:0;
    $this->data[$id] = $value;
    $this->cateArray[$id] = $parent;
    }
    function getChildsTree($id=0)
    {
    $childs=array();
    foreach ($this->cateArray as $child=>$parent)
    {
    if ($parent==$id)
    {
    $childs[$child]=$this->getChildsTree($child);
    }
    }
    return $childs;
    }
    function getParentsTree($id=0)
    {
    $parents=array();
    foreach ($this->cateArray as $child=>$parent)
    {
    if ($child ==$id)


    {
    $parents[$parent]=$this->getParentsTree($parent);
    }
    }
    return $parents;
    }
    function getChilds($id=0)
    {
    $childArray=array();
    $childs=$this->getChild($id);
    foreach ($childs as $child)
    {
    $childArray[]=$child;
    $childArray=array_merge($childArray,$this->getChilds($child));
    }
    return $childArray;
    }
    
    function getChild($id)
    {
    $childs=array();
    foreach ($this->cateArray as $child=>$parent)
    {
    if ($parent==$id)
    {
    $childs[$child]=$child;
    }
    }
    return $childs;
    }
    
    function getParents($id)
    {
    $parentArray=array();
    $parents=$this->getParent($id);
    foreach ($parents as $parent)
    {
    $parentArray[]=$parent;
    $parentArray=array_merge($parentArray,$this->getParents($parent));
    }
    return $parentArray;
    }
    
    function getParent($id)
    {
    $parents=array();
    foreach ($this->cateArray as $child=>$parent)
    {
    if ($child==$id)
    {
    $parents[$parent]=$parent;
    }
    }
    return $parents;
    }
    //单线获取父节点
    function getNodeLever($id)
    {
    $parents=array();
    if (key_exists($this->cateArray[$id],$this->cateArray))
    {
    $parents[]=$this->cateArray[$id];
    $parents=array_merge($parents,$this->getNodeLever($this->cateArray[$id]));
    }
    return $parents;
    }
    function getLayer($id,$preStr='
[解决办法]
-')
    {
    return str_repeat($preStr,count($this->getNodeLever($id)));
    }
    function getValue ($id)
    {
    return $this->data[$id];
    } // end func
}


[解决办法]
引用:
这帖子应该长期置顶,平均每半月有3个人问……

数据库的树状存储结构也一直是一个被问的话题,也可以拿出来讨论一下。


数据库的树状存储,如何达到删、增最容易等。
[解决办法]
读取树状数据的步骤
[解决办法]
=&  这个是运算符?
[解决办法]
很好的算法,参考一下
[解决办法]
不错,值得借鉴。
[解决办法]
感谢版主分享
[解决办法]
支持版主读取树状数据的步骤
[解决办法]
=&  这个是运算符? 
[解决办法]
方法不错,收藏
[解决办法]
初学者,看的有点蒙
[解决办法]
好东西!!读取树状数据的步骤
[解决办法]
研究盐焗鸡,好东西
[解决办法]
很好的方法 读取树状数据的步骤
[解决办法]
正在找这捏~谢楼主~
[解决办法]
 我以为语言都是相通的,但是还是看不懂,看样功力不够
[解决办法]
绝对的牛逼啊。。。。膜拜!!!
[解决办法]
还好 谢谢贴主赐教 。。。
[解决办法]
版主大哥~~再把你这个输出的树状数组转成以ID排序的二维数组呢?
Array([1]=>([id] => 1
             [pid] => 0
             [title] => Food),
     [2]=>]=>([id] => 2
             [pid] => 0
             [title] => Fruit),.....................
[解决办法]
支持支持支持
[解决办法]
不错的思路,代码蛮简洁
[解决办法]
读取树状数据的步骤
[解决办法]
很好的方法 读取树状数据的步骤
[解决办法]
嗯嗯,不错哦!
[解决办法]
不错,值得看看
[解决办法]
好东西,收藏了
[解决办法]
读取树状数据的步骤

热点排行