HierarchicalDataExploration(例如:无限分类、多级菜单、省市)Introduction什么是层次数据?类似于树结构,除了根节点和叶节点外,所有节点都有一个父节点和一个或多个子节点。您的大多数同学都使用过数据库中的分层数据。层次数据存在于很多基于数据库的应用中,包括论坛和邮件列表中的分类法、企业组织结构图、内容管理系统中的分类法、产品类别、无限制级别的类别、多级菜单、省市等等。但是因为关系型数据库中的表没有层级关系,只是简单的扁平列表;虽然层次数据具有父子关系,但显然关系数据库中的表不能自然地显示其层次特征。下面先用通用的方法和递归的方法实现无限分类,再讲通过两种数据模型对层次数据的处理。HierarchicalDataExploration(1.Recursiverecursion)HierarchicalDataExploration(2.AdjacencyListModel)HierarchicalDataExploration(3.NestedSetModel)变量的三种方式传递&引用赋值函数doloop1(&$i=1){print_r($我);$i++;如果($i<=10){doloop1($i);}}doloop1();static静态变量函数doloop2(){static$i=1;打印_r($i);$i++;如果($i<=10){doloop2();}}doloop2();global全局变量$i=1;functiondoloop3(){global$i;回声$我;$i++;如果($i<=10){doloop3();}}doloop3();构建模拟数据#模拟数据$data=[['id'=>1,'title'=>'Electronics','parent_id'=>0],['id'=>2,'title'=>'Laptops&PC','parent_id'=>1],['id'=>3,'title'=>'笔记本电脑','parent_id'=>2],['id'=>4,'title'=>'PC','parent_id'=>2],['id'=>5,'title'=>'相机和照片','parent_id'=>1],['id'=>6,'title'=>'Camera','parent_id'=>5],['id'=>7,'title'=>'Phones&Accessories','parent_id'=>1],['id'=>8,'title'=>'智能手机','parent_id'=>7],['id'=>9,'title'=>'Android','parent_id'=>8],['id'=>10,'title'=>'iOS','parent_id'=>8],['id'=>11,'title'=>'其他智能手机','parent_id'=>8],['id'=>12,'title'=>'电池','parent_id'=>7],['id'=>13,'title'=>'耳机','parent_id'=>7],['id'=>14,'title'=>'屏幕保护贴','parent_id'=>7],];获取无限极分类/***获取无限极分类树的值引用**@paramarray$data*@returnarray*/functionmake_tree($data){$refer=array();$树=数组();foreach($dataas$k=>$v){$refer[$v['id']]=&$data[$k];//为主键创建数组引用}foreach($dataas$k=>$v){$parent_id=$v['parent_id'];//获取当前分类的父idif($parent_id==0){$tree[]=&$data[$k];//顶级列}else{if(isset($refer[$parent_id])){$refer[$parent_id]['children'][]=&$data[$k];//如果有父级列,则添加父级列的子列数组}}}return$tree;}/***递归获取无限极分类树**@paramarray$data*@paramint$parent_id*@paramint$level*@returnarray*/functionmake_tree2($data=[],$parent_id=0,$level=0){$tree=[];if($data&&is_array($data)){foreach($dataas$v){if($v['parent_id']==$parent_id){$tree[]=['id'=>$v['id'],'level'=>$level,'title'=>$v['title'],'parent_id'=>$v['parent_id'],'children'=>make_tree2($data,$v['id'],$level+1),];}}}return$tree;}获取子节点和节点层级/***引用赋值方法*@paramarray$data*@paramint$id*@paramint$level*@returnarray*/functiongetSubTree($data=[],$id=0,$level=0){static$tree=[];foreach($dataas$key=>$value){if($value['parent_id']==$id){$value['laravel']=$level;$树[]=$值;getSubTree($data,$value['id'],$level+1);}}return$tree;}/***静态变量方法*@paramarray$data*@paramint$id*@paramint$level*@returnarray*/functiongetSubTree($data=[],$id=0,$level=0){静态$tree=[];foreach($dataas$key=>$value){if($value['parent_id']==$id){$value['laravel']=$level;$树[]=$值;getSubTree($data,$value['id'],$level+1);}}return$tree;}/***全局变量方法*@paramarray$data*@paramint$id*@paramint$level*@returnarray*/$tree=[];//先申明变量functiongetSubTree($data=[],$id=0,$level=0){global$tree;foreach($dataas$key=>$value){if($value['parent_id']==$id){$value['laravel']=$level;$树[]=$值;getSubTree($data,$value['id'],$level+1);}}return$tree;}通过pid获取所有上级分类常用于面包导航/***getParentsByParentId2($categories,9)**@paramarray$data*@param$parent_id*@returnarray*/functiongetParentsByParentId($data=[],$parent_id){static$categories=[];如果($data&&is_array($data)){foreach($dataas$item){如果($item['id']==$parent_id){$categories[]=$item;getParentsByParentId($data,$item['parent_id']);}}}返回$categories;}functiongetParentsByParentId2($data=[],$parent_id){$categories=[];if($data&&is_array($data)){foreach($dataas$item){如果($item['id']==$parent_id){$categories[]=$item;$categories=array_merge($categories,getParentsByParentId2($data,$item['parent_id']));}}}返回$类别;}
