加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > PHP > 正文

php 从数据库查询结果生成树形列表的简单示例

发布时间:2020-05-25 04:54:22 所属栏目:PHP 来源:互联网
导读:php 从数据库查询结果生成树形列表的简单示例

本代码可以从数据库读取数据生成一个类似于windows的资源管理器的树形列表,感兴趣的小伙伴,下面一起跟随脚本之家 jb51.cc的小编来看看吧。
经测试代码如下:


/**
 * 数据库查询结果生成树形列表
 *
 * @param 
 * @arrange (512.笔记) jb51.cc
 * 以下是我在此代码中使用的数据库定义(对于Solid)。
 * 将其改编为另一个数据库应该不难。
 **/
/* 
CREATE  TABLE  dirent_types  ( 
        id        INTEGER  NOT  NULL,icon        VARCHAR(50),name        VARCHAR(50),PRIMARY  KEY(id) 
);
INSERT  INTO  dirent_types  VALUES(1,'folderclosed','Directory'); 
INSERT  INTO  dirent_types  VALUES(2,'document','File');
CREATE  TABLE  directory  ( 
        id        INTEGER  NOT  NULL,parent        INTEGER  REFERENCES  directory(id),name        VARCHAR(200),type        INTEGER  REFERENCES  dirent_types(id),url        VARCHAR(200),PRIMARY  KEY(id) 
);
DROP  INDEX  directory_idx;
CREATE  UNIQUE  INDEX  directory_idx  ON  directory(parent,name);
CREATE  SEQUENCE  dirent_id;
"CREATE  PROCEDURE  insert_dir_entry 
        (name  VARCHAR,parent  INTEGER,type  INTEGER) 
        RETURNS(id  INTEGER) 
BEGIN 
        EXEC  SQL  WHENEVER  SQLERROR  ABORT; 
        EXEC  SEQUENCE  dirent_id.NEXT  INTO  id; 
        EXEC  SQL  PREPARE  c_insert 
                INSERT  INTO  directory 
                        (id,parent,type,name) 
                        VALUES(?,?,?); 
        EXEC  SQL  EXECUTE  c_insert  USING  (id,name); 
        EXEC  SQL  DROP  c_insert; 
END";
CALL  insert_dir_entry('My  Computer',NULL,1); 
CALL  insert_dir_entry('Network  Neighbourhood',1); 
CALL  insert_dir_entry('lucifer.guardian.no',2,1); 
CALL  insert_dir_entry('rafael.guardian.no',1); 
CALL  insert_dir_entry('uriel.guardian.no',1); 
CALL  insert_dir_entry('Control  Panel',1); 
CALL  insert_dir_entry('Services',6,1); 
CALL  insert_dir_entry('Apache',7,2); 
CALL  insert_dir_entry('Solid  Server  2.2',2);
*/
function  icon($icon,$name  =  '',$width  =  0,$height  =  0)  { 
        global  $DOCUMENT_ROOT; 
        $icon_loc  =  '/pics/menu'; 
        $file  =  "$DOCUMENT_ROOT$icon_loc/$icon.gif"; 
        if  (!$width  ||  !$height)  { 
        $iconinfo  =  getimagesize($file); 
        if  (!$width)  { 
                $width  =  $iconinfo[0]; 
        } 
        if  (!$height)  { 
                $height  =  $iconinfo[1]; 
        } 
        } 
        printf( '<img%s  border=0  align=top  src="/pics/menu/%s.gif"  '. 
              'width="%d"  height="%d">',$name  ?  "  name="$name""  :  '',$icon,$width,$height); 
}
/*
   *以递归方式显示给定起始的树的内容
   *点。
  *
   *参数:
   * $ parent - 父节点(未在目录中列出)。 节点
   * 0是根节点。
  *
   * $ maxdepth(可选) - 最大递归级别数。-1
   *(默认值)表示没有限制。
  *
   * $ ancestors(可选) - 一个祖先节点的数组
   *树的当前分支,节点最接近
   *指数0的顶部。
  *
   *使用的全局变量:
   * $ child_nodes
   * $ node_data
   * $ last_child
  *
   *全局变量修改:
   *将修改$ child_nodes中的数组指针。
  */
function  display_directory($parent,$showdepth  =  0,$ancestors  =  false)  { 
        global  $child_nodes,$node_data,$last_child; 
        reset($child_nodes[$parent]); 
        $size  =  sizeof($child_nodes[$parent]); 
        $lastindex  =  $size  -  1; 
        if  (!$ancestors)  { 
        $ancestors  =  array(); 
        } 
        $depth  =  sizeof($ancestors); 
        printf( '<div  id="node_%d"  class="dirEntry"  visibility="%s">',$parent,$showdepth  >  0  ?  'show'  :  'hide'); 
        while  (list($index,$node)  =  each($child_nodes[$parent]))  { 
        /* 
            For  each  of  the  uptree  nodes: 
            If  an  uptree  node  is  not  the  last  one  on  its  depth 
            of  the  branch,there  should  be  a  line  instead  of  a  blank 
            before  this  node's  icon. 
          */ 
        for  ($i  =  0;  $i  <  $depth;  $i++)  { 
                $up_parent  =  (int)$node_data[$ancestors[$i]][ 'parent']; 
                $last_node_on_generation  =  $last_child[$up_parent]; 
                $uptree_node_on_generation  =  $ancestors[$i]; 
                if  ($last_node_on_generation  ==  $uptree_node_on_generation)  { 
                icon( "blank"); 
                }  else  { 
                icon( "line"); 
                } 
        } 
        if  ($child_nodes[$node])  {  //  has  children,i.e.  it  is  a  folder 
                $conn_icon  =  "plus"; 
                $expand  =  true; 
        }  else  { 
                $conn_icon  =  "join"; 
                $expand  =  false; 
        } 
        if  ($index  ==  $lastindex)  { 
                $conn_icon  .=  "bottom"; 
        }  elseif  ($depth  ==  0  &&  $index  ==  0)  { 
                $conn_icon  .=  "top"; 
        } 
        if  ($expand)  { 
                printf( "<a  href="javascript:document.layers['node_%d'].visibility='show'">",$node); 
        } 
        icon($conn_icon,"connImg_$node"); 
        if  ($expand)  { 
                print( "</a>"); 
        } 
        $icon  =  $node_data[$node][ 'icon']; 
        if  (!$icon)  { 
                $type  =  $node_data[$node][ 'type']; 
                $icon  =  $GLOBALS[ 'dirent_icons'][$type]; 
        } 
        icon($icon,"nodeImg_$node");
        $name  =  $node_data[$node][ 'name']; 
        printf( '?<font  size="%d">%s</font><br%c>',-1,$name,10); 
        if  ($child_nodes[$node])  { 
                $newdepth  =  $showdepth; 
                if  ($newdepth  >  0)  { 
                $newdepth--; 
                } 
                $new_ancestors  =  $ancestors; 
                $new_ancestors[]  =  $node; 
                display_directory($node,$newdepth,$new_ancestors); 
        } 
        } 
        print( "</divn>"); 
}
function  setup_directory($parent,$maxdepth) 
{ 
        global  $dirent_icons,$child_nodes,$last_child;
        $dirent_icons  =  sql_assoc( 'SELECT  id,icon  FROM  dirent_types');
        $query  =  'SELECT  id,icon,name  '. 
                  'FROM  directory  '. 
                  'ORDER  BY  parent,name';
        $child_nodes  =  array(); 
        $node_data  =  array(); 
        $res  =  sql($query); 
        while  (list($id,$type,$name)  =  db_fetch_row($res))  { 
        $child_nodes[(int)$parent][]  =  $id; 
        $node_data[$id]  =  array( 'id'  =>  $id,'parent'  =>  $parent,'type'  =>  $type,'icon'  =>  $icon,'name'  =>  $name); 
        $last_child[(int)$parent]  =  $id; 
        } 
}

/***   代码来自脚本之家 jb51.cc(jb51.cc)   ***/

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读