class Category{
public $sonName;
public $parentName;
public function __consturt($id,$parent_id){
        $this->sonName = $id;
$this->parentName = $parent_id;
} /**
* 根据传递的父类ID获取所有的子级分类
* 组合一维数组
* @param [type] $data 分类数组
* @param integer $pid 父类id
* @param integer $lev 父类所属层级
* @return [type] 格式化后的数组信息
*/
public function unlimitedForLevel($data, $pid = 0, $lev = 0) {
$arr = array(); foreach($data as $v) {
if($v[$this->parentName] == $pid) {
$v['level'] = $lev + 1;
$arr[] = $v;
$arr = array_merge($arr, self::unlimitedForLevel($data, $v[$this->sonName], $lev + 1));
}
} return $arr;
} /**
* 根据传递的父类ID获取所有的子级分类
* 组合多维数组
* @param [type] $data 分类数组
* @param integer $pid 父类id
* @return [type] 格式化后的数组信息
*/
public function unlimitedForLayer($data, $pid = 0) {
$arr = array(); foreach($data as $v) {
if($v[$this->parentName] == $pid) {
$v['children'] = self::unlimitedForLayer($data, $v[$this->sonName]);
$arr[] = $v;
}
} return $arr;
} /**
* 根据传递子类ID获取所有的父级分类
* @param [type] $data 分类数组
* @param integer $id 子类id
* @return [type] 父类数组信息
*/
public function getParents($data, $id) {
$arr = array(); foreach($data as $v) {
if($v[$this->sonName] == $id) {
$arr[] = $v;
$arr = array_merge(self::getParents($data, $v[$this->parentName]), $arr);
}
} return $arr;
} /**
* 根据传递的父类ID获取所有的子级分类ID
* 注意返回值中不包括传递进来的父类ID
* @param [type] $data 分类数组
* @param [type] $pid 父类id
* @return [type] 子类id数组
*/
public function getChildsID($data, $pid) {
$arr =array(); foreach($data as $v) {
if($v[$this->parentName] == $pid) {
$arr[] = $v[$this->sonName];
$arr = array_merge($arr, self::getChildsID($data, $v[$this->sonName]));
}
} return $arr;
} /**
* 根据传递的子类ID获取所有的父类ID
* 注意返回值中不包括传递进来的子类ID
* @param [type] $data 分类数组
* @param [type] $id 子类id
* @return [type] 父类id数组
*/
public function getParentsID($data, $id) {
$arr = array(); foreach($data as $v) {
if($v[$this->sonName] == $id) {
$arr[] = $v[$this->parentName];
$arr = array_merge($arr, self::getParentsID($data, $v[$this->parentName]));
}
} return $arr;
} /**
* 获取结构化的数组
* @param $levelData 含有分级信息的数组
* @return array
*/
public function getTree($levelData)
{
// usort($leveData,array('Category','sortByLever'));
$leveDataReform = $this->reformArr($levelData);
$treeList = array();
foreach($leveDataReform as $data){
if($data['level']==1){//一级
$treeList[$data['id']] = $data;
}elseif($data['level']==2){//二级
$level2_parent_id[$data['id']] = $data['parent_id'];
$treeList[$data['parent_id']]['child'][$data['id']] = $data;
}elseif($data['level']==3){//三级
if(isset($level2_parent_id[$data['parent_id']])){
$treeList[$level2_parent_id[$data['parent_id']]]['child'][$data['parent_id']]['child'][$data['id']] = $data;
}
} }
return $treeList;
} function getDataTree($rows, $id='id',$pid = 'parent_id',$child = 'child',$root=0) {
$tree = array(); // 树
if(is_array($rows)){
$array = array();
foreach ($rows as $key=>$item){
$array[$item[$id]] =& $rows[$key];
}
foreach($rows as $key=>$item){
$parentId = $item[$pid];
if($root == $parentId){
$tree[] =&$rows[$key];
}else{
if(isset($array[$parentId])){
$parent =&$array[$parentId];
$parent[$child][]=&$rows[$key];
}
}
}
}
return $tree;
} /**
* @param array $arr
* @param string $field
* @return array
*/
public function reformArr($arr = array(array('id'=>1, 'other'=>''),), $field = 'id'){
$new_arr = array();
if (!is_array($arr)) {
return $new_arr;
}
foreach ($arr as $av) {
if (!is_array($av)) {
break;
}
if (!array_key_exists($field, $av)) {
break;
}
if (!isset($new_arr[$av[$field]])) {
$new_arr[$av[$field]] = $av;
}
}
return $new_arr;
} /**
* @param $a
* @param $b
* @return int
*/
public function sortByOrderID($a,$b)
{ if($a['order_id']==$b['order_id'])
{
return 0;
}else{
return $a['order_id']>$b['order_id']?1:-1;
}
} /**
* @param $a
* @param $b
* @return int
*/
public function sortByLever($a,$b)
{
if($a['level']==$b['level'])
{
return 0;
}else{
return $a['level']>$b['level']?1:-1;
}
} } require 'medoo.php';
require './TimerHelper.php';
$database = new medoo([
'database_type' => 'mysql',
'database_name' => 'test',
'server' => 'localhost',
'username' => 'root',
'password' => '',
'charset' => 'gbk'
]); $classify = $database->query("SELECT * FROM classify ORDER BY level ASC,orderid DESC,id asc LIMIT 100000")->fetchAll(); /*
$tree_data = [
['id'=>1,'parent_id'=>0,'name'=>'01','order_id'=>0],
['id'=>2,'parent_id'=>0,'name'=>'02','order_id'=>0],
['id'=>3,'parent_id'=>0,'name'=>'03','order_id'=>0],
['id'=>4,'parent_id'=>1,'name'=>'14','order_id'=>0],
['id'=>5,'parent_id'=>1,'name'=>'15','order_id'=>0],
['id'=>6,'parent_id'=>1,'name'=>'16','order_id'=>0],
['id'=>7,'parent_id'=>2,'name'=>'27','order_id'=>0],
['id'=>8,'parent_id'=>2,'name'=>'28','order_id'=>0],
['id'=>9,'parent_id'=>2,'name'=>'29','order_id'=>0],
['id'=>10,'parent_id'=>4,'name'=>'104','order_id'=>100],
['id'=>11,'parent_id'=>4,'name'=>'114','order_id'=>10000],
['id'=>12,'parent_id'=>4,'name'=>'124','order_id'=>10000],
['id'=>13,'parent_id'=>11,'name'=>'104','order_id'=>12],
['id'=>14,'parent_id'=>11,'name'=>'114','order_id'=>11],
['id'=>15,'parent_id'=>11,'name'=>'124','order_id'=>10],
];
*/ $cate = new Category('id','parent_id');
TimerHelper::start('1');
echo "";
//print_r($cate->unlimitedForLevel($tree_data,0,0)); $tree_data = $cate->getTree($classify); foreach($tree_data as $key=>$class){
echo $class['name']."";
if(isset($class['child']) && !empty($class['child'])){
foreach($class['child'] as $child1_class){
echo " ".$child1_class['name']."";
if(isset($child1_class['child']) && !empty($child1_class['child'])){
foreach($child1_class['child'] as $child2_class){
echo "   ".$child2_class['name']."";
} }
}
}
} TimerHelper::stop('1'); /***** CREATE TABLE `classify` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL COMMENT '产品名称',
`admin_id` int(10) unsigned NOT NULL COMMENT '管理员id',
`parent_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '父级id',
`level` tinyint(4) unsigned NOT NULL DEFAULT '1' COMMENT '第几级',
`orderid` smallint(4) unsigned NOT NULL DEFAULT '999' COMMENT '排序',
`flag` tinyint(4) unsigned NOT NULL DEFAULT '1' COMMENT '是否隐藏',
`addtime` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `parent_id` (`parent_id`),
KEY `flag` (`flag`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=gbk; *****/

php分类树的更多相关文章

  1. C#无限极分类树-创建-排序-读取 用Asp.Net Core+EF实现之方法二:加入缓存机制

    在上一篇文章中我用递归方法实现了管理菜单,在上一节我也提到要考虑用缓存,也算是学习一下.Net Core的缓存机制. 关于.Net Core的缓存,官方有三种实现: 1.In Memory Cachi ...

  2. C#无限极分类树-创建-排序-读取 用Asp.Net Core+EF实现

    今天做一个管理后台菜单,想着要用无限极分类,记得园子里还是什么地方见过这种写法,可今天找了半天也没找到,没办法静下心来自己写了: 首先创建节点类(我给它取名:AdminUserTree): /// & ...

  3. ecshop显示所有分类树栏目

    1.找到 category.php 和goods.php 两个文件修改: $smarty->assign('categories', get_categories_tree(0)); // 分类 ...

  4. 决策树算法原理(CART分类树)

    决策树算法原理(ID3,C4.5) CART回归树 决策树的剪枝 在决策树算法原理(ID3,C4.5)中,提到C4.5的不足,比如模型是用较为复杂的熵来度量,使用了相对较为复杂的多叉树,只能处理分类不 ...

  5. OneThink生成分类树方法(list_to_tree)使用!

    具体方法: Application / Common / Common / function.php 下的 224行: function list_to_tree($list, $pk='id', $ ...

  6. sklearn 学习之分类树

    概要 基于 sklearn 包自带的 iris 数据集,了解一下分类树的各种参数设置以及代表的意义.   iris 数据集介绍 iris 数据集包含 150 个样本,对应数据集的每行数据,每行数据包含 ...

  7. C#开发BIMFACE系列27 服务端API之获取模型数据12:获取构件分类树

    系列目录     [已更新最新开发文章,点击查看详细] BIMFACE官方示例中,加载三维模型后,模型浏览器中左上角默认提供了“目录树”的功能,清晰地展示了模型的完整构成及上下级关系. 本篇介绍如何获 ...

  8. php 两种获取分类树的方法

    php 两种获取分类树的方法 1. /** * 获取分类树 * @param array $array 数据源 * @param int $pid 父级ID * @param int $level 分 ...

  9. Sklearn分类树在合成数集上的表现

    小伙伴们大家好~o( ̄▽ ̄)ブ,今天我们开始来看一下Sklearn分类树的表现,我的开发环境是Jupyter lab,所用的库和版本大家参考: Python 3.7.1(你的版本至少要3.4以上) S ...

  10. 机器学习实战---决策树CART简介及分类树实现

    https://blog.csdn.net/weixin_43383558/article/details/84303339?utm_medium=distribute.pc_relevant_t0. ...

随机推荐

  1. 常用校验算法CRC、MD5、SHA_转

    1.算法概述 数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名.数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密.数据摘要算法也被称为哈希(H ...

  2. python第三周文件处理和函数-----下

    #默认参数的值是在一开始定义的时候就传给了函数, # 在后来的修改中不会被修改. #默认参数的值必须放到位置形参参数的最后面 #默认参数使用的场景是一个参数不经常变得场景,所以参数一般是不可变类型.字 ...

  3. 第一百八十二节,jQuery-UI,知问前端--日历 UI

    jQuery-UI,知问前端--日历 UI 学习要点: 1.调用 datepicker()方法 2.修改 datepicker()样式 3.datepicker()方法的属性 4.datepicker ...

  4. Eigen求矩阵行列式 及 行列式本质

    转置.伴随.行列式.逆矩阵 小矩阵(4 * 4及以下)eigen会自动优化,默认采用LU分解,效率不高 #include <iostream> #include <Eigen/Den ...

  5. 页面加载,使用ajax查询某个类别,并且给它们添加(拼接)连接

    直接上代码 $(function(){ var a = ''; $.get("productType1_findAll.action",function(data){ consol ...

  6. python使用电子邮件模块smtplib的方法(发送图片 附件)实用可行

    Smptp类定义:smtplib.SMTP(host[,port[,local_hostname[,,timeout]]]),作为SMTP的构造函数,功能是与smtp服务器建立连接,在连接成功后,就可 ...

  7. 字符设备驱动程序--LED驱动

    编写驱动程序需要编写那些代码: 1.硬件相关的驱动程序 2.Makefile的编译程序 3.还需要编写一个相关的测试程序 比如说:一个摄像头驱动程序 1.驱动程序的编写,需要编写一些硬件相关的操作,编 ...

  8. Android无线测试之—UiAutomator UiDevice API介绍八

    获取包名.开启通知栏.快速设置.获取布局文件的方法 一.包名.通知栏.快速设置.布局文件等相关知识: 1)包名:标示应用的符号,每个应用的名字 2)通知栏:从主界面的顶端向下拉,就可以打开通知栏 3) ...

  9. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)3.2——设置Flavors和Variants

    问题: 需要构建大体上一样,但是使用不同资源或者类的应用. 解决方案: 产品的flavors可以帮助你对同一个app创建不同的版本. 讨论: build types是开发过程的一部分,一般用来将app ...

  10. 使用IDEA工具整合mybatis时使用@Resource和@Autowired自动注解bean时会显示红色问题的解决办法

    使用IDEA工具整合mybatis时使用@Resource和@Autowired自动注解bean时会显示红色问题的解决办法 idea中springboot整合mybatis时,通过@Autowired ...