php无限分类 构建树形结构
<?php
class Classification {
const PARENT_ID = 'parentid';
const ID = 'id';
const CHILDREN = 'children';
public static function getTree($items) {
$children = [];
// group by parent id
foreach ($items as &$item) {
$children[ $item[self::PARENT_ID] ][] = &$item;
unset($item);
}
foreach ($items as &$item) {
$pid = $item[self::ID];
if (array_key_exists($pid, $children)) {
$item[self::CHILDREN] = $children[ $pid ];
}
unset($item);
}
return $children[0];
}
}
test:
<?php $items = [
['id' => 1, 'parentid' => 0, 'name' => 'PHP'],
['id' => 2, 'parentid' => 1, 'name' => 'PHP_Framework'],
['id' => 42, 'parentid' => 1, 'name' => 'DevTools'],
['id' => 3, 'parentid' => 2, 'name' => 'ThinkPHP5'],
['id' => 4, 'parentid' => 2, 'name' => 'Laravel'],
['id' => 43, 'parentid' => 42, 'name' => 'PHPStorm'],
['id' => 44, 'parentid' => 42, 'name' => 'EclipsePDT'],
];
shuffle($items); echo '<pre>';
$a = array_map(function($item) {
return $item['name'];
}, $items);
print_r($a); $t = Classification::getTree($items);
var_dump($t);
// echo json_encode($t);
Thinkphp Model
<?php
namespace app\model;
use think\Model;
class Link extends Model {
protected $pk = 'id';
protected $field = ['des', 'source', 'target', 'structid'];
/**
* @param $items
* $items = array(
* array('id' => 42, 'parentid' => 1),
* array('id' => 43, 'parentid' => 42),
* array('id' => 1, 'parentid' => 0));
* @return mixed
* Array (
* [0] => Array(
* [id] => 1
* [parentid] => 0
* [childs] => Array(
* [0] => Array (
* [id] => 42
* [parentid] => 1
* [childs] => Array(
* [0] => Array(
* [id] => 43
* [parentid] => 42
* )
* )
* )
* )
* )
* )
*/
public static function buildTree($items) {
$childs = array();
foreach($items as &$item) {
$childs[$item['parentid']][] = &$item;
unset($item);
}
foreach($items as &$item) {
if (isset($childs[$item['id']])) {
$item['childs'] = $childs[$item['id']];
}
unset($item);
}
return $childs[0];
}
/**
* 节点id下一级节点id数组
*/
public function listChildNodeId_r($nodeid) {
$a = $this->listChildNodeId($nodeid);
$list = []; // recursively
foreach ($a as $it) {
array_push($list, $it);
$ca = $this->listChildNodeId($it);
foreach ($ca as $ci) {
array_push($list, $ci);
}
}
return $list;
}
// 节点id下一级节点id数组
private function listChildNodeId($parentid) {
$where = ['source' => $parentid];
$a = $this->field('target')->where($where)->select();
$t = [];
foreach ($a as $item) {
array_push($t, $item['target']);
}
unset($a);
return $t;
}
}
php无限分类 构建树形结构的更多相关文章
- java中实现无限层级的树形结构
本文展示了两个实现方法的代码.两个代码的实现方法不同,代码2更为简单. 先看一下最后实现的结果: 最后结果-json 代码1: 实现过程: 1.传入一段json字符串 2.将字符串转换成对象存入节点列 ...
- java、js中实现无限层级的树形结构(类似递归)
js中: var zNodes=[ {id:0,pId:-1,name:"Aaaa"}, {id:1,pId:0,name:"A"}, {id:11,pId:1 ...
- 树形结构的数据库表Schema设计-基于左右值编码
树形结构的数据库表Schema设计 程序设计过程中,我们常常用树形结构来表征某些数据的关联关系,如企业上下级部门.栏目结构.商品分类等等,通常而言,这些树状结构需要借助于数据库完 成持久化.然而目前的 ...
- [SQL Server]树形结构的创建
对于SQL Server来说,构建显示一个树形结构不是一件容易的事情,逻辑构造能力不是它的强项.不过也不是说它没有能力干这个事情,只要换一种思维方式就可以理解它的工作原理. 例如,现在有一张表的内容如 ...
- Java实现树形结构的数据转Json格式
在项目中难免会用到树形结构,毕竟这是一种常用的组织架构.楼主这里整理了两个实现的版本,可以直接拿来使用,非常方便. 楼主没有单独建项目,直接在以前的一个Demo上实现的.第一种,看下面代码: pack ...
- Delphi中根据分类数据生成树形结构的最优方法
一. 引言: TreeView控件适合于表示具有多层次关系的数据.它以简洁的界面,表现形式清晰.形象,操作简单而深受用户喜爱.而且用它可以实现ListView.ListBox所无法实现的很多功能 ...
- SQL 实现地区的实现树形结构递归查询(无限级分类),level为节点层级,由小至大依次
//SQL 实现地区的实现树形结构递归查询(无限级分类),level为节点层级,由小至大依次 2018-09-25 StringBuilder areaSQL = new StringBuilder( ...
- Java编程:将具有父子关系的数据库表数据转换为树形结构,支持无限层级
在平时的开发工作中,经常遇到这样一个场景,在数据库中存储了具有父子关系的数据,需要将这些数据以树形结构的形式在界面上进行展示.本文的目的是提供了一个通用的编程模型,解决将具有父子关系的数据转换成树形结 ...
- c#:无限极树形结构
最近一直在研究树形结构菜单,无意中让我弄了出来.先上代码: 首先需要这个的一个类 public class Tree { public int id { get; set; } public stri ...
随机推荐
- SQL 练习12
查询和" 01 "号的同学学习的课程 完全相同的其他同学的信息 分析 如果某同学学的某一个课程和01同学所学的课程有对应,那么子查询返回false. 如果没有对应,子查询返回tru ...
- centos8安装mysql8.0
官网下载rpm地址 https://dev.mysql.com/downloads/repo/yum/ wget下载 wget https://repo.mysql.com//mysql80-comm ...
- 【SpringMVC】@RequestMapping注解
@RequestMapping注解的源码 @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNT ...
- 浅看spa单页应用路由
路由观察浏览器的URL的变更.当URL 变更时,路由会解析它并生成一个新的路由实例. 一个基本的路由是这样的: class Router { private _defaultController: s ...
- WPF中Converter的使用
WPF中Converter的用于对数据的转换.以下实例将实现将数据中的性别属性的转换(0:男,1:女). 1.创建SexConverter.cs类,并实现IValueConverter接口 publi ...
- mysql行转列 问题 SUM(IF(条件,列值,0))
sum(if(条件,列值,0))语法用例: select name,sum(if(subject="语文",score,0)) as "语文" from gra ...
- SpringCloud之Config
1.背景 在前的学习中,我们几乎解决了springCloud的所有常规应用,但是大家有没有想过这样一个问题: 是使用微服务后,有非常多的application.yml文件,每个模块都有一个,实际开发中 ...
- 什么是挂载,Linux挂载详解
前面讲过,Linux 系统中"一切皆文件",所有文件都放置在以根目录为树根的树形目录结构中.在 Linux 看来,任何硬件设备也都是文件,它们各有自己的一套文件系统(文件目录结构) ...
- 关于PLSQL中的一些问题总结:在PLSQL中书写DDL等
关于问题前导,使用的数据表中涉及到的字段和类型: 在PLSQL中create.drop.truncate等DDL是没有办法直接执行的. 必须要使用: Execute immediate 'DDL语句' ...
- 4种Golang并发操作中常见的死锁情形
摘要:什么是死锁,在Go的协程里面死锁通常就是永久阻塞了,你拿着我的东西,要我先给你然后再给我,我拿着你的东西又让你先给我,不然就不给你.我俩都这么想,这事就解决不了了. 本文分享自华为云社区< ...