php 实现树形结构

<?php
class Tree{
private $OriginalList;
public $pk;//主键字段名
public $parentKey;//上级id字段名
public $childrenKey;//用来存储子分类的数组key名

function __construct($pk="id",$parentKey="pid",$childrenKey="children"){
if(!empty($pk) && !empty($parentKey) && !empty($childrenKey)){
$this->pk=$pk;
$this->parentKey=$parentKey;
$this->childrenKey=$childrenKey;
}else{
return false;
}

}
//载入初始数组
function load($data){
if(is_array($data)){
$this->OriginalList=$data;
}
}

/**
* 生成嵌套格式的树形数组
* array(..."children"=>array(..."children"=>array(...)))
*/
function DeepTree($root=0){
if(!$this->OriginalList){
return FALSE;
}
$OriginalList=$this->OriginalList;
$tree=array();//最终数组
$refer=array();//存储主键与数组单元的引用关系
//遍历
foreach($OriginalList as $k=>$v){
if(!isset($v[$this->pk]) || !isset($v[$this->parentKey]) || isset($v[$this->childrenKey])){
unset($OriginalList[$k]);
continue;
}
$refer[$v[$this->pk]]=&$OriginalList[$k];//为每个数组成员建立引用关系
}
//遍历2
foreach($OriginalList as $k=>$v){
if($v[$this->parentKey]==$root){//根分类直接添加引用到tree中
$tree[]=&$OriginalList[$k];
}else{
if(isset($refer[$v[$this->parentKey]])){
$parent=&$refer[$v[$this->parentKey]];//获取父分类的引用
$parent[$this->childrenKey][]=&$OriginalList[$k];//在父分类的children中再添加一个引用成员
}
}
}
return $tree;
}
}
$data=array(
0 => array("id"=>1,"pid"=>0),
1 => array("id"=>2,"pid"=>0),
2 => array("id"=>3,"pid"=>1),
3 => array("id"=>4,"pid"=>3),
4 => array("id"=>5,"pid"=>2),
);
var_dump($data);
$tree=new Tree("id","pid","children");
$tree->load($data);
$treelist=$tree->DeepTree();//所有分类树结构
var_export($treelist);//查看结果
$subtree=$tree->DeepTree(1);//获取id为1下面的子树
var_export($subtree);
?>

转自http://www.thinkphp.cn/topic/7487.html

时间: 2024-08-30 05:03:27

php 实现树形结构的相关文章

Java创建树形结构算法实例

在JavaWeb的相关开发中经常会涉及到多级菜单的展示,为了方便菜单的管理需要使用数据库进行支持,本例采用相关算法讲数据库中的条形记录进行相关组装和排序讲菜单组装成树形结构. 首先是需要的JavaBean 1 2 3 import java.io.Serializable; 4 import java.util.ArrayList; 5 import java.util.Collections; 6 import java.util.Comparator; 7 import java.util.

Hibernate中,基于Annotation的简单树形结构的实现

在系统设计中,经常用到递归性质的树形结果,比如菜单.多级分类等,一般是在同一个表中定义父子关系实现这种结构. 下面是在Hibernate中,基于Annotation的简单树形结构的实现: 第一步:创建Entity类,并添加注解实现关联关系    ps: 主要是利用@ManyToOne 和 @OneToMany 配置在同一个Entity类中实现树形递归的结构.hibernate注解形式比在xml配置更加简洁 TreeNode.java 1 package com.hfut.hibernate; 2

Qt QTreeWidget 树形结构实现(转)

Qt中实现树形结构可以使用QTreeWidget类,也可以使用QTreeView类,QTreeWidget继承自QTreeView类.树形效果如下图所示: 这是怎么实现的呢?还有点击节点时会有相应的事件响应. 1. 树形结构实现 QT GUI中有treeWidget部件,将该控件在Gui中布局好,假设其对象名为treeWidget. QTreeWidget类官方文档:http://qt-project.org/doc/qt-4.8/qtreewidget.html 树形结构通过QTreeWidg

递归算法解析成树形结构

/** * 递归算法解析成树形结构 * * @param cid * @return * @author jiqinlin */ public TreeNodeModel recursiveTree(int org_code) { //根据cid获取节点对象(SELECT * FROM tb_tree t WHERE t.cid=?) MiddleOrgEntity middleOrgEntity = new MiddleOrgEntity(); middleOrgEntity.setTable

你认为扁平化模式好还是树形结构好?

我认为对于小公司来说,扁平化的模式更好一些.由于小公司的规模比较小,公司内的员工不多,所需要的管理层次不多.扁平化模式的决策层和操作层之间的中间管理层次少,这可以使企业能够快速地将决策权延至企业生产.营销的最前线,从而为提高企业效率.而且由于公司规模小,管理部门之间的信息资源的交流.相互调用不会太多,这样可以是决策者集中更多的精力在企业的市场对策和企业发展的战略问题上. 对于大公司来说,树形结构会更好一些.大公司的规模比较大,所要做的项目比较多,如果一个人负责多个项目会造成项目完成效率不高.在树

解析java树形结构

思路一: 1.准备表结构及对应的表数据a.表结构: create table TB_TREE ( CID NUMBER not null, CNAME VARCHAR2(50), PID NUMBER //父节点 ) b.表数据: insert into tb_tree (CID, CNAME, PID) values (1, '中国', 0); insert into tb_tree (CID, CNAME, PID) values (2, '北京市', 1); insert into tb_

sqlite3树形结构遍历效率对照測试

sqlite3树形结构遍历效率对照測试 一.缘起 项目数据结构:本人从事安防行业,视频监控领域.项目中会遇到监控点位的组织机构划分.暂时划分的巡逻点位等.这些相机点位.连同组织机构,它们在逻辑关系上构成了一个树形结构. 又因为不论什么一个点位属于一个组织机构,也可能属于一个被暂时创建的视频巡逻计划中,因此,能够看出,不论什么一个节点,包含相机节点和组织机构节点,都有可能有至少一个父级节点,且不论什么一个组织机构节点也会有多个下级子节点.这中逻辑关系又构成了图. 数据量规模:一个市级别的管理平台,

salesforce 零基础学习(七十)使用jquery tree实现树形结构模式

项目中UI需要用到树形结构显示内容,后来尽管不需要做了,不过还是自己做着玩玩,mark一下,免得以后项目中用到. 实现树形结构在此使用的是jquery的dynatree.js.关于dynatree的使用可以参考:http://wwwendt.de/tech/dynatree/doc/dynatree-doc.html#h4.2 对于树形结构,这里不做太多介绍,树一般需要一个根节点,根节点下面可以有很多子节点或者叶子节点,子结点也可以包含叶子结点或者子节点.我们在设计表结构的时候可以考虑自连接操作

Delphi中根据分类数据生成树形结构的最优方法

一. 引言:    TreeView控件适合于表示具有多层次关系的数据.它以简洁的界面,表现形式清晰.形象,操作简单而深受用户喜爱.而且用它可以实现ListView.ListBox所无法实现的很多功能,因而受到广大程序员的青睐.    树形结构在Windows环境中被普遍应用,但在数据库开发中面对层次多.结构复杂的数据,如何快速构造树形目录并实现导航呢?    二. 实现关键技术:    在Delphi提供的控件中包含了TreeView控件,但树的具体形成还需要用户编写代码.即它的列表项要在程序

树形结构的数据库的存储

程序设计过程中,我们常常用树形结构来表征某些数据的关联关系,如企业上下级部门.栏目结构.商品分类等等,通常而言,这些树状结构需要借助于数据库完成持久化.理想中树形结构应该具备如下特征:数据存储冗余度小.直观性强:检索遍历过程简单高效:节点增删改查CRUD操作高效. 列举了一个食品族谱的例子进行讲解,通过类别.颜色和品种组织食品,树形结构图如下: 1,对树形结构最直观的分析莫过于节点之间的继承关系上,通过显示地描述某一节点的父节点,从而能够建立二维的关系表,则这种方案的Tree表结构通常设计为:{