分类树

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;

 *****/
时间: 2024-11-08 20:07:08

分类树的相关文章

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

在上一篇文章中我用递归方法实现了管理菜单,在上一节我也提到要考虑用缓存,也算是学习一下.Net Core的缓存机制. 关于.Net Core的缓存,官方有三种实现: 1.In Memory Caching 我理解是在内容中实现,这种方法适用于单服务器的生产环境. 2.a Distributed Cache 分部式缓存实现. 3.Response Cache 这种方式我理解为客户端缓存. 今天我只用了第一种实现方法,内存中缓存,之所以用这种方法我是觉得我这里用缓存的初衷是为了减少访问数据库的次数,

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

今天做一个管理后台菜单,想着要用无限极分类,记得园子里还是什么地方见过这种写法,可今天找了半天也没找到,没办法静下心来自己写了: 首先创建节点类(我给它取名:AdminUserTree): 1 /// <summary> 2 /// 无限极节点类 3 /// </summary> 4 public class AdminUserTree 5 { 6 /// <summary> 7 /// 节点信息 8 /// </summary> 9 public int

无限分类树操作

获取相应分类id的分类树: public static function getCategoryTree($id){ //$model=M('category'); if($id>0){ $obj=self::selectTable('category',array('id'=>$id),true);//$model->where(array('id'=>$id))->find(); if(!is_null($obj)){ $childList=self::selectTab

ROC检验分类树性能

001 ############################################################# 002 ############# 读取excel文件 ###################### 003 ############################################################# 004 #root<-"C:/Users/liming/Desktop/写书/chap7/cbc/" 005 root

分类树测试用例设计工具:CTE XL

1.1工具安装 CTE XL是一款免费的分类树测试用例设计工具,安装过程很简单,下载好安装程序后,运行安装程序:如图点击下一步:点击下一步:是否创建桌面按钮:安装:  安装完成后,需要注册才能获取免费的License,打开CTE XL,会弹出一个注册的对话框,输入好Firstname,Famliyname,Organization,Email后系统将会发送一封带License的邮件到填写的email地址上,获取后,复制到license key中就完成注册了 1.2 CTE XL的使用 在了解CT

创建无限极分类树型结构

先上效果图 顶级分类其实就是一级分类,二级分类也叫作一级分类的子分类,在这个基础上,子分类还可以拥有子分类,这样就构成了无限极分类. 接下来看具体实现的代码: 一.在控制器中按字段查询,查询出所有分类信息(id:该分类的ID值,cate_name:该分类的名称,pid:父ID,sorts:为显示标题顺序排序做准备,可不写.) 1 public function cate_display() 2 { 3 $cate = D('Cate'); 4 $field = array('id','cate_

让ECSHOP商品列表页和商品详细页分类树跟首页一样

如何让商品列表页或商品详情页的分类树都跟首页一样,也是显示全部所有的分类呢?修改方法:1.商品列表页修改方法:打开category.php 文件将$smarty->assign('categories',       get_categories_tree($cat_id));修改为$smarty->assign('categories',       get_categories_tree());2.商品详情页修改方法:将$smarty->assign('categories',   

ArcGIS中的Geostatistical Analyst 插值方法分类树

您必须要做的最重要决定之一就是确定开发插值模型的目标.换句话说,您需要模型提供什么信息才能做出决定?例如在公共卫生区域中,插值模型用于预测在统计意义上可与发病率产生关联的污染物等级.根据该信息可进一步设计采样研究和制定公共卫生政策等. Geostatistical Analyst 提供多种不同的插值方法.每种方法都有独一无二的特征并提供不同的信息(某些情况下,各种方法提供相似的信息;另外一些情况下,信息可能有很大的差异).下图显示了根据不同条件分类的方法.选择一个对您的特定情况比较重要的条件,然

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

小伙伴们大家好~o( ̄▽ ̄)ブ,今天我们开始来看一下Sklearn分类树的表现,我的开发环境是Jupyter lab,所用的库和版本大家参考: Python 3.7.1(你的版本至少要3.4以上) Scikit-learn 0.20.0 (你的版本至少要0.20) Graphviz 0.8.4 (没有画不出决策树哦,安装代码conda install python-graphviz) Numpy 1.15.3, Pandas 0.23.4, Matplotlib 3.0.1, SciPy 1.1

php 两种获取分类树的方法

1. /** * 获取分类树 * @param array $array 数据源 * @param int $pid 父级ID * @param int $level 分类级别 * @return string */function getCategory($array, $pid =0, $level = 0){ //声明静态数组,避免递归调用时,多次声明导致数组覆盖 static $list = []; foreach ($array as $key => $value){ //第一次遍历,