PHP 实现简单的树形列表 之二

2017.5.22 北京 大雨

来到公司之后, 准备把代码移植到公司的小项目里,移植的过程中发现了一处设计有问题的地方,调整一下。

第一处错误是:构建叶子节点的时候,只保存了节点的名称,没有存ID, 如果页面跟后台交互的时候,当存在节点名称一样的情况,服务器就不能判断出用户正在再操作那个节点。

更改了一下数据结构的定义:
用数组来存放一个节点, 如果这个节点是末端节点,则该数组,只有一个字符串元素,

如果一个节点为叶子节点,则该节点将会有两个字符串元素,第一元素存节点名称,第二个元素存节点ID。
如果这个节点存在子节点,则在当前数组中,增加一个数组,所有的子节点的元素存放在这个数组中。

从数据库中取数据的代码调整如下:

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;
        return [$nodeName, $parentid];
}

生成HTML list的代码调整如下

function build_html_list($data)
{
    //输出标准父子节点
    if (is_array($data) and count($data) == 2){
        if (is_string($data[0]) and is_array($data[1])){
            // 输出节点名
            echo "<li>".$data[0];
            // 输出子节点
            if (is_array($data[1])){
                echo "<ul>";
                foreach ($data[1] as $item){
                    if (is_string($item)){
                        echo "<li>".$item."</li>";
                    } 
                    else{
                        build_html_list($item);    
                    }
                }
                echo "</ul>";
            }
            echo "</li>";   
        }
        // 输出叶子节点 2017.5.22 add by sunhu
        else if (is_string($data[0]) and is_int($data[1])){
            echo sprintf(‘<li cid="%d">%s</li>‘, $data[1], $data[0]);
        }                         
    } 
}

这样,如果用户单击一个 li 元素的时候,就可以从 li元素的 cid 属性中,查找到 节点 id 了

时间: 2024-10-21 19:58:45

PHP 实现简单的树形列表 之二的相关文章

PHP 实现简单的树形列表。

最近在为公司开发一个在线浏览PDF文档的小web系统.在构建动态列表的时候犯了愁,很久没写代码了,手有些生了,搞了半天才搞出来,写篇博文记录一下. 首先是数据库设计 我设计的一个列数为三列的表Treenodes,这三列分别用来存储当前节点的id.节点名称.父节点 SQL如下 CREATE TABLE `treenodes` (   `id` int(11) NOT NULL,   `node_name` varchar(50) DEFAULT NULL,   `pid` int(11) DEFA

网络采集软件核心技术剖析系列(7)---如何使用C#语言搭建程序框架(经典Winform界面,顶部菜单栏,工具栏,左边树形列表,右边多Tab界面)

一 本系列随笔概览及产生的背景 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受广大博客写作和阅读爱好者的喜爱.同时也不乏一些技术爱好者咨询我,这个软件里面各种实用的功能是如何实现的. 该软件使用.NET技术开发,为回馈社区,现将该软件中用到的核心技术,开辟一个专栏,写一个系列文章,以飨广大技术爱好者. 本系列文章除了讲解网络采编发用到的各种重要技术之外,也提供了不少问题的解决思路和界面开发的编程经验,非常适合.NET开发的初级,中级读者,希望大家多多支持. 很多初学者常有此类困惑,“为

简单的树形目录展示

<!DOCTYPE html><head> <meta charset="utf-8"/><title>树形菜单</title><style type="text/css" media="all">a,a:visited { color:#333; text-decoration:none; }a:hover { color:#f60; }body,td { font:13p

如何将数据库中存的树转化为树形列表(以easyui的tree为例)

很多时候,我们会把一棵树存放到数据库中,当前台需要展示一个树形列表时,将这棵树读取出来并显示,这个过程是怎么实现的呢? 这篇文章是以构造一棵easyui前台框架的一个树形列表为例,后台框架是spring MVC+JPA. 首先看一下数据库中这颗树是怎么存的: 树的结构一目了然,这是一棵表示部门的树. 下面是实体类: /** * 部门类 用户所属部门(这里的部门是一个相对抽象的词) * 使用前缀编码,每级增加三个数字,如:第一级 001,第二级001001,第三级001001001 * @auth

Android学习笔记二十四之ListView列表视图二

Android学习笔记二十四之ListView列表视图二 前面一篇我们介绍了常用的几种适配器的简单实现和ListView的简单使用,这一篇中,我们介绍一下ListView的优化和一些其它的问题. ListView优化方法一 在ListView中,我们最常用的就是自定义Adapter,在我们自定义Adapter中,需要实现两个比较重要的方法getCount()和getView(),前者是负责计算ListView的总Item数,后者是生成Item,有多少个Item就会调用getView()方法多少次

EasyUI+zTree实现简单的树形菜单切换

使用easyui_ztree实现简单的树形菜单切换效果 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <!--导入juery核心配置文件--> <script type="text/javascript" src="../js/jquery-1.8.3.js"></script> <!--导入eas

访问控制列表(二)

一  扩展访问控制列表的配置 1:创建ACL Router(config)# access-list  access-list-number { permit | deny } protocol { source source-wildcard destination  destination-wildcard } [ operator operan ]            命令参数详细说明: access-list-number:访问控制列表表号,对于扩展ACL来说,是100-199的一个数

树形 列表折叠效果

代码: <!DOCTYPE HTML> <html> <head> <title>读取并修改元素的内容</title> <meta charset="utf-8" /> <style> div{float:left; height: 100px; line-height: 100px; } #d1,#d3{ background-color: #ccff00; } #d2{ cursor: pointe

Ajax-ajax实例3-动态树形列表

项目结构: 项目演示: 技术要点: 1.3.2 技术要点在基本原理的介绍中,了解到通过在父节点内动态创建子节点,并利用样式表缩进完成树形列表的基本框架.除了这一点外,还有下面一些问题需要考虑.1 .将父节点所有的子节点放入一个容器中基本原理页面中仅包含了创建子节点的功能,不可以将创建好的节点再进行关闭操作.实际应用中菜单总是包含打开和关闭两种操作.为了方便进行关闭操作,将子节点放入一个容器中,在关闭时只需要设置容器的显示属性即可.2 .节点开关的具体实现每个父节点的所有子节点放入容器中后,在单击