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 ...
随机推荐
- stm32 串口接收一次后再也无法接受,接受都为0
经检测为串口接受后进入别的程序,开辟了2048的临时数组,因为堆栈溢出.stm32总共堆栈为
- Pytest-Allure报告的Logo的完美定制
--本次需求:如何把生成的pytest-allure报告的logo修改成自定义的logo? --步骤如下: --1.找到本地电脑安装的allure-2.13.2路径E:\allure-2.13.2\p ...
- noip18
T1 来自cf原题 考场直接暴力枚举 \(A,B\),15pts. 正解: 首先时间的表达式,\(T=\frac{A}{a_{i}}+\frac{B}{b_{i}}\),然后以\(\frac{1}{a ...
- 题解 b
传送门 考场上只会暴力 \(n^4\) DP,部分分还写炸了 但其实这个DP可以前缀和优化到 \(n^3\) ,我觉得没有这档部分分就没写 但其实是有这一档的,我没有看出来-- 正解想不到 如果我们已 ...
- 题解 matrix
传送门 无比毒瘤的dp题,而且伪装地好像很可做的样子 考场上我给它氪了差不多一个小时最后还是只能扔了个20pts状压走人 以下思路基本均来源于题解: 对于此题,题面中三个限制条件: (1)第 i 行第 ...
- P5038 奇怪的游戏
题目询问了一个不能确定的时间,所以显然做法中要包含一个二分答案. 我们将整张图分为黑白点两种,黑点旁边的点就是白点,白点旁边的点就是黑点,想一下就能知道,每次操作会使黑白点的数字各加一,而我们的目的就 ...
- docker配置cdn-容器内可以通过域名访问
添加docker的cdn配置 # 没有这个文件创建 vim /etc/docker/daemon.json 添加内容如下 { "dns":["8.8.8.8", ...
- uniapp封装小程序雷达图组件实现
效果图: view <canvas id="radar-canvas" class="radar-canvas" type="2d"& ...
- javaWeb常用面试题
JDBC JDBC访问数据库的基本步骤是什么? 加载驱动 通过DriverManager对象获取连接对象Connection 通过连接对象获取会话,有2种方式Statement.PreparedSta ...
- C# wpf中关于binding的converter无效的情况
最近碰到bingding设置了convert转换无效的问题.困扰了我好久.这里记录分析一下. 先说下现象 我把TextBox的text属性 绑定到了对应的 convert.代码如下 希望吧pd_no ...