<?php
header('content-type:text/html;charset=utf-8');
class Category
{
//原始的分类数据
private $rawList=array();
//格式化后的分类
private $formatList=array();
//格式化的字符
private $icon = array('│','├','└');
//字段映射,分类id,上级分类pid,分类名称title,格式化后分类名称fulltitle
private $field=array();
/*
功能:构造函数;
属性:public;
参数: $field,字段映射,分类id,上级分类pid,分类名称title,格式化后分类名称fulltitle
依次传递,例如在分类数据表中,分类id,字段名为cid,上级分类pid,字段名称name,希望格式化分类后输出cname,
则,传递参数为,$field('cid','pid','name','cname');若为空,则采用默认值。
*/
public function __construct($field=array())
{
$this->field['id']=isset($field['0'])?$field['0']:'id';
$this->field['pid']=isset($field['1'])?$field['1']:'pid';
$this->field['title']=isset($field['2'])?$field['2']:'title';
$this->field['fulltitle']=isset($field['3'])?$field['3']:'fulltitle';
}
/*
功能:返回给定上级分类$pid的所有同一级子分类;
属性:public;
参数:上级分类$pid;
返回:子分类,二维数组;
*/
public function getChild($pid,$data=array())
{
$childs=array();
if(empty($data))
{
$data=$this->rawList;
}
foreach($data as $Category)
{
if($Category[$this->field['pid']]==$pid)
$childs[]=$Category;
}
return $childs;
}
/*
功能:得到递归格式化分类;
属性:public;
参数:$data,二维数组,起始分类id,默认$id=0;
返回:递归格式化分类数组;
*/
public function getTree($data,$id=0)
{
//数据为空,则返回
if(empty($data))
return false;
$this->rawList=array();
$this->formatList=array();
$this->rawList=$data;
$this->_searchList($id);
return $this->formatList;
}
private function _searchList($id=0,$space="")
{
//下级分类的数组
$childs=$this->getChild($id);
//如果没下级分类,结束递归
if(!($n=count($childs)))
return;
$cnt=1;
//循环所有的下级分类
for($i=0;$i<$n;$i++)
{
$pre="";
$pad="";
if($n==$cnt)
{
$pre=$this->icon[2];
}
else
{
$pre=$this->icon[1];
$pad=$space?$this->icon[0]:"";
}
$childs[$i][$this->field['fulltitle']]=($space?$space.$pre:"").$childs[$i][$this->field['title']];
$this->formatList[]=$childs[$i];
//递归下一级分类
$this->_searchList($childs[$i][$this->field['id']],$space.$pad." ");
$cnt++;
}
}
}
$data[]=array('cat_id'=>1,'pid'=>0,'name'=>'中国');
$data[]=array('cat_id'=>2,'pid'=>0,'name'=>'美国');
$data[]=array('cat_id'=>3,'pid'=>0,'name'=>'韩国');
$data[]=array('cat_id'=>4,'pid'=>1,'name'=>'北京');
$data[]=array('cat_id'=>5,'pid'=>1,'name'=>'上海');
$data[]=array('cat_id'=>6,'pid'=>1,'name'=>'广西');
$data[]=array('cat_id'=>7,'pid'=>6,'name'=>'桂林');
$data[]=array('cat_id'=>8,'pid'=>6,'name'=>'南宁');
$data[]=array('cat_id'=>9,'pid'=>6,'name'=>'柳州');
$data[]=array('cat_id'=>10,'pid'=>2,'name'=>'纽约');
$data[]=array('cat_id'=>11,'pid'=>2,'name'=>'华盛顿');
$data[]=array('cat_id'=>12,'pid'=>3,'name'=>'首尔');
$cat=new Category(array('cat_id','pid','name','cname'));
$s=$cat->getTree($data);//获取分类数据树结构
//$s=$cat->getTree($data,1);获取pid=1所有子类数据树结构
foreach($s as $vo)
{
echo $vo['cname'].'<br>';
}
?>
相关推荐
二阶FLL辅助三阶PLL环路的代码解读
今天对GNSS接收机里面的载波跟踪环路代码进行了解读 以下是个人的一点见解 % 载波环第二步:环路滤波器 二阶FLL辅助三阶PLL环路 carrLoopS0 = lastCarrLoopS0 + (phaseErr*tau0PLL + freqErr*tau1FLL) * PDIcarr; carrLoopS1 = lastCarrLoopS1 + (tau1PLL*phaseErr + carrLoopS0 + tau2FLL*freqErr) * PD
ThinkPHP框架总结之安全及使用
本片文章主要总结和介绍了使用TP过程中,加强项目安全的一些办法,具体是以例子为导向验证演示。
告别FreeRTOS?手把手带你用NuttX在STM32F4-Discovery上跑起第一个Shell
本文详细介绍了如何在STM32F4-Discovery开发板上从FreeRTOS迁移到NuttX,并运行第一个Shell。NuttX以其完整的POSIX兼容性和模块化架构优势,特别适合复杂网络应用的开发。通过环境搭建、移植配置、调试技巧及POSIX开发实践,帮助开发者高效构建嵌入式系统。
ThinkPHP的连贯操作方法中field方法有很多的使用技巧
ThinkPHP的连贯操作方法中field方法有很多的使用技巧,field方法主要目的是标识要返回或者操作的字段,下面详细道来。 1、用于查询 在查询操作中field方法是使用最频繁的。 $Model->field('id,title,content')->select(); 这里使用field方法指定了查询的结果集中包含id,title,content三个字段的值。执行的SQL相当于
【Cadence】 ADS Dynamic Link使用教程
在Cadence617上使用ADS Dynamic Link
量化交易中的烂板策略:短线高频交易实战解析
量化交易通过算法模型实现自动化投资决策,其中短线高频交易是典型应用场景。从市场微观结构看,涨停板现象反映了资金博弈的动态平衡,而烂板策略正是捕捉涨停板短暂打开时的交易机会。该策略结合L2行情数据和Python量化框架,通过参数化规则识别特定形态的烂板股票,在风险可控前提下追求超额收益。实战中需严格遵循动态仓位管理和止损纪律,适用于A股市场短线交易。高频交易与量化分析技术的结合,为投资者提供了新的alpha挖掘工具。
tp5源码分析之模型
1 数据模型数据模型(Model) 主要实现对单个数据表的操作,包括数据表整体操作数据表字段操作数据表的数据操作1-1 数据模型的创建Model->__construct()数据模型的构造函数,创建数据模型对象public function __construct($data = []) { if (is_object($data)) { $t...
Ubuntu 22.04蓝牙开关秒关?别慌,可能是这个Intel固件文件在搞鬼
本文深入解析Ubuntu 22.04蓝牙开关秒关问题,指出Intel固件文件缺失是常见原因,并提供详细修复方案。通过确认硬件型号、检查固件文件及智能替代方案,帮助用户快速解决蓝牙故障,提升系统稳定性。
ThinkPHP联表查询
1、table 方法 原生sql方法 原生sql语法:select 表1.字段,表2.字段 from 表1as 别名1,表名2 as 别名 2 where 表1.字段 = 表2.字段; select t1.*,t2.name as deptname from sp_user as t1,sp_dept as t2 where t1.dept_id = t2.id; ...
【3D Slicer】的小白入门使用指南一
3D Slicer 是一个免费的开源软件平台,用于医学、生物医学和其他 3D 图像的可视化、处理、分割、配准和分析。Slicer 的功能包括:读/写。
【以太网硬件六】1000base-T物理层编码究竟是怎么编的?
详述1000base-T物理层4D-PAM5的编码过程
thinkphp getField( )和field( )
做数据库查询的时候,比较经常用到这两个,zong'shi'ch
Claude Code设置中文输出指南
Claude Code 的语言配置其实并不复杂,只要做好全局的默认设置,再加上一些小的提醒技巧,就能完全避免突然切换英文的问题,让你全程用中文流畅地和 AI 助手协作,不用再被语言问题打断工作节奏,真正提升开发效率。
树获取选中父节点_『数据结构与算法』B树图文详解(含完整代码)
GitHub源码分享 微信搜索:码农StayUp 主页地址:https://gozhuyinglong.github.io 源码分享:https://github.com/gozhuyinglong/blog-demos1. 前言 迄今为止,已经介绍了《 二叉查找树 》和《 AVL树 》,我们始终假设可以把整个数据结构存储在内存中。可是,如果数据多到内存装不下,这就意味着必须把数据放在磁盘上,显然...
VC中sqlite的使用
在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示
最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版
Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。
【C++】【二叉树】【AVL 树】构建avl tree 类
文章目录前言一、重点解析1、恢复平衡2、插入节点3、删除节点3、析构函数二、完整AVL tree类参考 前言 AVL树的引入是为了改造BST 的不平衡性,防止退化为链表。BST 类的构造在文末有链接。 AVL树使得其任一节点的左右子树高度差不超过1。平衡性相对宽松。使得其可以有看起来不平衡但却认为平衡的结构。 而二叉堆、线段树等平衡二叉树是叶子节点的高度差不超过1。 其在插入和删除的时候,都需要从插入、删除节点处向上维护平衡。 一、重点解析 1、恢复平衡 恢复平衡分为了四种情况,分别记为LL、RR、LR
ET2012新版免狗免安装绿色软件
ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,
实现一个简单的234树
234树也是一种平衡树,但是相对于红黑树来说它的代码复杂度要低一些,它能做到树的平衡最主要的原因是它会进行合理的分裂。 1. 定义一个数据项类 public class DataItem { public int key; public DataItem(int key){ this.key = key; } public void dis...
Statistics and Machine Learning Toolbox
Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具
十-5, 哈夫曼树概述及Java实现
文章目录12.1 哈夫曼树概述12.1.1 与哈夫曼树相关的概念12.1.2 什么是哈夫曼树12.2 哈夫曼树的构造方法12.3 哈夫曼树的代码实现12.3 哈夫曼编码(待补充) 12.1 哈夫曼树概述 12.1.1 与哈夫曼树相关的概念 概念 含义 1. 路径 从树中一个结点到另一个结点的分支所构成的路线 2. 路径长度 路径上的分支数目 3. 树的路径长度 从根到每个结点的路径长度之和 4. 带权路径长度 结点具有权值, 从该结点到根之间的路径长度乘以结点的权值, 就是该结
简单实现哈夫曼树的建立、编码与解码
哈夫曼树建立、编码、解码 1、哈夫曼树的建立 Huffman树是根据元素的权重建立的,权重较小的离根结点较远,而权重较大的离根结点较近,从而使得整个Huffman树有着最小的带权路径长度。Huffman树的具体特性请参考《数据结构》一书或者是其他博客。 首先给出Huffman树的结点类: public class HuffmanNode { int weight; char c; Huffm...
LeetCode 208.实现前缀树
Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补全和拼写检查。请你实现TrieTrie()初始化前缀树对象。向前缀树中插入字符串word。如果字符串word在前缀树中,返回true(即,在检索之前已经插入);否则,返回false。如果之前已经插入的字符串word的前缀之一为prefix,返回true;否则,返回false。
用kd树实现k近邻算法
构造kd树 在这里《统计学习方法》用到了平衡kd树,在学习平衡kd树之前可以先学习一下比较简单的平衡二叉树。这里我们直接按照《统计学习方法》中构造kd树的步骤来写代码: class Node: """构造节点类,节点包括当前节点data,当前节点的深度depth,当前节点的左右子节点left和right""" def __init__(self, data, depth=0, left=None, right=None): self.data = data se.
瑞_数据结构与算法_B树
本文章为瑞_系列专栏之《数据结构与算法》的B树篇。B树(B-Tree)结构是一种高效存储和查询数据的方法,B树结构非常适合应用于磁盘等大型存储器的高效操作,被广泛应用于关系数据库和文件系统中。
平衡树(AVL树)
二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。 当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可以降低树的高度,从而减少平均搜索长度。 AVL树 ...
基于数组实现的Huffman树和Huffman编码
大二记一次数据结构课上讲的huffman树和huffman编码,数组实现huffman
python实现b树_Python版B树
话说以前的树都用java写的,最近发现python有点生疏了,于是用python写了个B树实现,B树在索引领域用得还是蛮多了,如果没记错mysql的默认索引好像就是B树…首先是数据实体对象,很简单,只存放key,valueclass Entity(object):'''数据实体'''def __init__(self,key,value):self.key = keyself.value = va...
KD树构建---kd树的三维代码和二维代码C++
1、三维空间点代码: 1、kdtree.h /** * @file kdtree.h * @brief Thisis a brief description. * @author dongjian * @par Copyright (c): * All Rights Reserved * @date 2018:04:24 * @note mattersneeding attention */ #ifndef _5383BD42_37.
哈夫曼树的java实现
首先:定义哈夫曼树的节点类,为了方便使用集合类的排序功能,实现了Comparable接口(可以不是实现该接口,此时需要实现排序功能) [java] view plaincopy package my.huffmanTree; public class Node implements Comparable> { priv
2629



被折叠的 条评论
为什么被折叠?



