PHP 实现简单的树形列表。
admin
2023-06-17 17:41:50
0

最近在为公司开发一个在线浏览PDF文档的小web系统。在构建动态列表的时候犯了愁,很久没写代码了,手有些生了,搞了半天才搞出来,写篇博文记录一下。

首先是数据库设计

我设计的一个列数为三列的表Treenodes,这三列分别用来存储当前节点的id、节点名称、父节点

SQL如下

CREATE TABLE `treenodes` (
  `id` int(11) NOT NULL,
  `node_name` varchar(50) DEFAULT NULL,
  `pid` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


前台页面已经搭好。只要能构建形如下面的html代码,前台的js就能很好的展现树形列表了。

       
  • 根节点        
                 
    • 子节点1
    •            
    • 子节点2                
                           
      • 孙子节点1
      •                    
      • 孙子节点1
      •                
                 
    •        
       

先放置一些测试数据供展现。

INSERT INTO `treenodes` VALUES ('1', 'INMIX 培训知识库', '-1');
INSERT INTO `treenodes` VALUES ('2', 'IT部门', '1');
INSERT INTO `treenodes` VALUES ('3', 'HR部门', '1');
INSERT INTO `treenodes` VALUES ('4', '线上培训', '1');
INSERT INTO `treenodes` VALUES ('5', '线下培训', '1');
INSERT INTO `treenodes` VALUES ('6', 'ERP系统方面 ', '2');
INSERT INTO `treenodes` VALUES ('7', '软件应用方面', '2');
INSERT INTO `treenodes` VALUES ('8', 'IT设备应用方面', '2');
INSERT INTO `treenodes` VALUES ('9', '店铺系统方面', '2');
INSERT INTO `treenodes` VALUES ('10', '钉钉轻松小秘书日程管理(V1.0).pdf', '6');


第一步先把数据从数据库中取出来

$conn = new mysqli('xxx.xxx.xxx.xxx', 'userxxx', 'xxxxxx', 'QuotationSystem');
/* check connnection */
if ($conn ->connect_errno){
      printf("Connect failed: %s \n", $conn->connect_error);
      exit();
}
if ($q = $conn ->query('select * from treenodes a')){
  $result = $q-> fetch_all();
}

第二步是将数据存放在一个多维的数组里边

定义的数据结构是:
用数组来存放一个节点, 如果这个节点是末端节点,则该数组,只有一个字符串元素,
如果这个节点存在子节点,则在当前数组中,增加一个数组,所有的子节点的元素存放在这个数组中。

function build_book_tree($data, $parentid){
    $nodeName = '';
    $child = [];
    foreach($data as $key => $val){
        //如果当前遍历的项跟查询的id相同,则获取节点的名称
        if ($val[0] == $parentid){
            $nodeName = $val[1];
        }
        //如果当前节点的父节点跟查询的节点相同,则通过递归,获取他的子节点,并将结果,赋给当前节点节点数组中
        if ($val[2] == $parentid){
            array_push($child, build_book_tree($data, $val[0]));
        }
    }
    //不存放空节点
    if (count($child) > 0)
        return array($nodeName, $child);
    else 
        return $nodeName;
}

第三步 是生成html 列表元素, 这是我今天卡壳的地方。递归用的不太好,后来整理了一下思路,问题就迎刃而解了。

思路:先尝试把一个节点,拥有一个子节点的数据结构构建成html树。然后再构建复杂的情情况。函数只要实现

  • 节点名
    • 子节点一
    • ...
  • 就行了。递归函数只帮我们构建最简单的形式,赋予它更多的意义,实现起来困难程度就会加倍。 所有构建html树的实现应该是这样的:

    function build_html_list($data)
    {
        if (is_array($data) and count($data) == 2 and is_string($data[0])){
            // 输出节点名
            echo "
  • ".$data[0];         // 输出子节点         if (is_array($data[1])){             echo "
      ";             foreach ($data[1] as $item){                 if (is_string($item)){                     echo "
    • ".$item."
    • ";                 }                  else{                     build_html_list($item);                     }             }             echo "
    ";         }         echo "
  • ";     }      // 输出单个元素的节点     else if (is_string($data)){         echo "
  • ".$data."
  • ";     } }

    输出它的时候,需要给上述方法添加“

      ”html元素。

      附件:http://down.51cto.com/data/2366681

    相关内容

    热门资讯

    美媒担忧:特朗普内阁4人接连出... 在中期选举来临之际,美国总统特朗普给内阁进行了大换血,4名女性阁员接连出局,接替她们的都是男性。这个...
    华为发布“韬定律”,西方科技的... 如果把芯片比作城市,过去五十多年,全球半导体行业都在遵循一个由美国人定下的死规矩,即把街道越做越细,...
    新华社:“零差评”藏猫腻,起底... 原标题:拍案·打击黑灰产|“零差评”藏猫腻 起底“网络水军”刷单控评黑色产业链“物超所值”“无限回购...
    上海定目标!到2030年服务业... 【大河财立方消息】5月27日,上海市人民政府发布《关于推进服务业扩能提质的实施意见》,明确到2030...
    山东省政府原副秘书长、办公厅原... 据山东省纪委监委消息:经山东省委批准,山东省纪委监委对省政府原副秘书长、办公厅原党组成员卢杰严重违纪...
    以军称已打死哈马斯新任军事领导... 以军当地时间27日证实,巴勒斯坦伊斯兰抵抗运动(哈马斯)新任军事领导人穆罕默德·奥德被打死。截至目前...
    86版《西游记》主创40年后在... 86版《西游记》主创40年后在济源相聚,六小龄童向记者讲述《西游记》长红的背后故事从“猴哥”到“猴叔...
    哪吒汽车方运舟及张勇被冻结17... 【大河财立方消息】天眼查法律诉讼信息显示,近日,上海哲奥实业有限公司新增两则股权冻结信息,被执行人分...
    跨国公司,为何持续加码中国? 【大河财立方 记者 闫文瑞 王宁宁 北京报道】 更大力度吸引和利用外资,有了新成效。今年1月至4月,...
    从“看景”到“入戏”:一场文旅... 孟夏时节,万物并秀,太行叠翠,洹水似练。5月23日,2026河南省文化旅游发展大会在安阳成功举办。国...