php实现的树形结构数据存取类实例

来源:中文源码网    浏览: 次    日期:2018年9月2日

【下载文档:  php实现的树形结构数据存取类实例.txt 】

(友情提示:右键点上行txt文档名->目标另存为)

php实现的树形结构数据存取类实例 本文实例讲述了php实现的树形结构数据存取类。分享给大家供大家参考。

具体实现代码如下:

复制代码 代码如下:

* $arr = array(

* array( 'id' => 1, 'name' => 'php', 'path' => '1' ),

* array( 'id' => 3, 'name' => 'php1', 'path' => '1-3' ),

* array( 'id' => 2, 'name' => 'mysql', 'path' => '2' ),

* array( 'id' => 6, 'name' => 'mysql1', 'path' => '2-6' ),

* array( 'id' => 7, 'name' => 'mysql2', 'path' => '2-7' ),

* array( 'id' => 5, 'name' => 'php11', 'path' => '1-3-5' ),

* array( 'id' => 4, 'name' => 'php2', 'path' => '1-4' ),

* );

* $cate = new Tree($arr);

*

* $data = $cate->getChild(2);

*

* print_r($data->toArray());

*

*

*/

class Tree

{

public $_info; //节点信息

public $_child = array(); //子节点

private $_parent; //父节点

private $_data; //当前操作的临时数据

private static $_indexs = array(); //所有节点的索引

private static $_index_key = 'id'; //索引键

private static $_tree_key = 'path'; //树形结构表达键

private static $_tree_delimiter = '-'; //属性结构表达分割符

/**

* 构造函数

*

* @param array $arr

* @param boole $force_sort 如果为真,将会强制对$arr 进行排序

* @return void

*/

public function __construct(array $arr = array(), $force_sort=true)

{

if ($force_sort === true) {

$arr=$this->_array_sort($arr, self::$_tree_key);

}

if (!emptyempty($arr)) {

$this->_init($arr);

}

}

/**

* 初始存储树形数据

*

* @param array $arr

* @return void

*/

private function _init(array $arr)

{

foreach ($arr as $item) {

$path = $item[self::$_tree_key];

$paths = explode(self::$_tree_delimiter, $path);

$count_paths = count($paths);

$parent_id = isset($paths[$count_paths-2]) ? $paths[$count_paths-2] : NULL;

if ( $count_paths>1 //如果有父级

&& array_key_exists($parent_id, self::$_indexs) //父级已经被存入索引

&& self::$_indexs[$parent_id] instanceof Tree //父级为Tree对象

) {

self::$_indexs[$parent_id]->addChild($item);

} elseif ($count_paths == 1) {

$this->addChild($item);

} else {

throw new Exception("path数据错误".var_export($item, true));

}

}

//print_r(self::$_indexs);

}

/**

* 添加子节点

*

* @param array $item

* @return void

*/

public function addChild(array $item, $parent = NULL)

{

$child = new Tree();

$child->_info = $item;

$child->_parent = $parent == NULL ? $this : $parent;

$child->_parent->_child[] = $child;

$this->_addIndex($item, $child->_getSelf());

}

/**

* 添加节点到索引

*

* @param array $item

* @param mix $value

* @return void

*/

private function _addIndex(array $item, $value)

{

if (array_key_exists(self::$_index_key, $item) && is_int($item[self::$_index_key])) {

self::$_indexs[$item[self::$_index_key]] = $value;

} else {

throw new Exception("id字段不存在或者不为字符串");

}

}

/**

* 获取对自己的引用

*

* @return Tree object quote

*/

private function _getSelf()

{

return $this;

}

/**

* 获取指定id的节点的子节点

*

* @param int $id

* @return Tree object

*/

public function getChild($id)

{

$data = self::$_indexs[$id]->_child;

$this->_data = $data;

return $this;

}

/**

* 获取指定id的节点的父节点

*

* @param int $id

* @return Tree object

*/

public function getParent($id)

{

$data = self::$_indexs[$id]->_parent;

$this->_data = $data;

return $this;

}

/**

* 获取指定id的节点的同级节点

*

* @param int $id

* @return Tree object

*/

public function getBrother($id)

{

$data = self::$_indexs[$id]->_parent->_child;

$this->_data = $data;

return $this;

}

/**

* 将Tree对象转化为数组

*

* @param object $object

* @return array

*/

public function toArray($obj = NULL)

{

$obj = ($obj === NULL) ? $this->_data : $obj;

$arr = array();

$_arr = is_object($obj) ? $this->_getBaseInfo($obj) : $obj;

if (is_array($_arr)) {

foreach ($_arr as $key => $val){

$val = (is_array($val) || is_object($val)) ? $this->toArray($val) : $val;

$arr[$key] = $val;

}

} else {

throw new Exception("_arr不是数组");

}

return $arr;

}

/**

* 过滤_parent等字段,以免造成无限循环

*

* @param object $obj

* @return void

*/

private function _getBaseInfo($obj)

{

$vars = get_object_vars($obj);

$baseInfo['_info'] = $vars['_info'];

$baseInfo['_child'] = $vars['_child'];

return $baseInfo;

}

/**

* 二维数组排序

*

* 根据指定的键名对二维数组进行升序或者降序排列

*

* @param array $arr 二维数组

* @param string $keys

* @param string $type 必须为 asc或desc

* @throws 当参数非法时抛出异常

* @return 返回排序好的数组

*/

private function _array_sort(array $arr, $keys, $type = 'asc') {

if (!is_string($keys)) {

throw new Exception("非法参数keys:参数keys的类型必须为字符串");

}

$keysvalue = $new_array = array();

foreach ($arr as $k=>$v) {

if (!is_array($v) || !isset($v[$keys])) {

throw new Exception("参数arr不是二维数组或arr子元素中不存在键'{$keys}'");

}

$keysvalue[$k] = $v[$keys];

}

switch ($type) {

case 'asc':

asort($keysvalue);

break;

case 'desc':

arsort($keysvalue);

break;

default:

throw new Exception("非法参数type :参数type的值必须为 'asc' 或 'desc'");

}

reset($keysvalue);

foreach ($keysvalue as $k=>$v) {

$new_array[$k] = $arr[$k];

}

return $new_array;

}

}

?>

希望本文所述对大家的PHP程序设计有所帮助。

亲,试试微信扫码分享本页! *^_^*

php 处理树形数据,php实现的树形结构数据存取类实例相关推荐

  1. java 树形数据_JAVA处理树状结构数据

    之前对于树状结构的处理没什么困难,但是最近的一个需求就很麻烦.其实遍历出树状结构并不是什么困难的事情,但是这个需求需要从底层节点统计数量,然后向上修改所有的父级结构. 最难的地方就是这个地方,可能有的 ...

  2. ajax使用json下拉框,ajax请求后台得到json数据后动态生成树形下拉框的方法

    如下所示: $(function(){ $.ajax({ url:"departmentAction_getAllDep.action", type:"post" ...

  3. Kettle使用_16 闭包Closure Generator树形数据

    Kettle使用_16 闭包Closure Generator树形数据 需求: 通过Kettle的组件实现对树形结构数据的深度(层次)的生成. 解决方法:结合闭包Closure Generator.排 ...

  4. vue+element实现树状表格的增删改查;使用el-table树形数据与懒加载实现树状表格增删改查

    以下代码可以直接复制使用 一.情景: 列表是一个树状表格,可以无限添加下级,以及对列表的某一行进行增删改查(目前查没有写). 原博链接 二.本篇是在原博主的代码基础上添加了部分功能. 功能1: 给树状 ...

  5. c# 插入树形数据#_C#数据类型能力问题 套装1

    c# 插入树形数据# This section contains aptitude questions and answers on C# data types (set 1). 本节包含有关C#数据 ...

  6. Web中树形数据(层级关系数据)的实现—以行政区树为例

    在Web开发中常常遇到树形数据的操作,如菜单.组织机构.行政区(省.市.县)等具有层级关系的数据. 以下以行政区为例说明树形数据(层级关系数据)的存储以及实现,效果如图所看到的. 1 数据库表结构设计 ...

  7. react-antd table树形数据默认展开行实现以及自定义图标实现及踩坑(defaultExpandedRowKeys,expandedRowKeys)

    前言: 最近在做一个权限管理的后台项目,经常涉及到树形数据展示,就用到了antd,table表格树形数据组件.记录一下使用过程的坑. 环境及配置: antd -3.23.6(大版本为antd 3)   ...

  8. vue中的 vxe-table表格插件 实现树形数据表

    一个 PC 端表格组件,大数据表格 vue vxe-table表格 vue vxe-table表格 2022-01-20 11:51·前端开发 可以自定义选择引入的模块,减少项目的体积: 多主题,多图 ...

  9. JS二维数组转树形数据

    JS二维数组转树形数据 // 测试数据const arr = [{ id: '1', pid: '0', name: 'jack', age: 20 },{ id: '2', pid: '0', na ...

最新文章

  1. onethink后台编辑器 提示:未检测到兼容版本的flash
  2. 大厂的 404 页面都长啥样?最后一个绝了...
  3. python狗狗年龄换算_Python之美——一只数据狗的笔记[长期更新]
  4. 【机器学习基础】优化算法详解
  5. Python2与Python3区别
  6. 顺序容器(vector、list、string、deque、forward_list)及迭代器、容器适配器
  7. FormsAuthenticationTicket基于forms的验证
  8. python操作redis集群_python 连接管理作redis集群
  9. 跨平台(windows+linux)的线程辅助程序,跨平台(Windows+Linux)的Socket通讯程序(二)—结构...
  10. C#设计模式学习笔记:(20)职责链模式
  11. Python 学习过程问题记录
  12. pc控制iphone的软件_哪个备忘录便签app可以和PC电脑一块儿用
  13. 基于错误的sql注入
  14. 【三次握手、四次挥手流程】及【长短链接区别】
  15. T-SQL查询进阶—理解SQL Server中的锁
  16. C++ std::lock_guard 自动加锁、释放锁 原理
  17. jquery中的trigger和triggerHandler区别
  18. springboot mybatis 后台框架平台 集成代码生成器 shiro 权限
  19. vld检测不输出_原创干货 | 基于机器学习的webshell检测踩坑小记
  20. 怎么把图片变成PDF

热门文章

  1. 产品经理必备成长修炼秘籍(深度解析)
  2. php对象序列化总出错false
  3. RESTful架构详解【转】
  4. 缘何Square可以在移动支付领域上成功?
  5. 移除单链表的倒数第N个节点
  6. 关于Kingfisher--备用
  7. 2.9-mysql主从配置-3
  8. GOOD MEETINGS CREATE SHARED UNDERSTANDING, NOT BRDS!
  9. Dynamics CRM 提示“操作无效”
  10. 使用FtpWebRequest 类操作(上传、下载和删除)FTP上的XML文件