无尽极归类列举和查寻和顶层归类产品查寻等

2021-04-06 15:45 jianzhan
无尽极归类简易点说便是一个类能够分为好几个子类,随后一身高类又能够分此外好几个子类那样无尽分下来,就行象windows能够在建一个文档夹,随后在这里个文档夹里又能够建一些个文档夹,在文档夹下边还能够建一些文档夹一样 那PHP也是怎样完成它的无尽归类的呢?怎样把它的每个归类逐一列举来呢? 最先,大家来假定有那样一数量组 $arr = array( 0= array( cid = 1, pid = 0, name = 亚洲地区 , 1= array( cid = 2, pid = 0, name = 北美地区洲 , 2= array( cid = 3, pid = 1, name = 我国 , 3= array( cid = 4, pid = 2, name = 英国 , 4= array( cid = 5, pid = 3, name = 北京市 , 5= array( cid = 6, pid = 3, name = 河北省 , 6= array( cid = 7, pid = 5, name = 城南区 , 7= array( cid = 8, pid = 5, name = 北京海淀区 , 大家这儿必须一个相近那样的展现实际效果如图所示 

假如大家要想将这一数字能量数组如圖般很形象化的主要表现出去得话就必须用php的递回归完成,那麼如何完成呢?看看面的关键编码
private function GetTree($arr,$pid,$step){
 global $tree;
 foreach($arr as $key= $val) {
 if($val[ pid ] == $pid) {
 $flg = str_repeat( └― ,$step);
 $val[ name ] = $flg.$val[ name ];
 $tree[] = $val;
 $this- GetTree($arr , $val[ cid ] ,$step+1);
 return $tree;
拷贝编码 
随后大家只必须写一个启用的编码就行
$newarr = $this- GetTree($arr, 0, 0);
依据子类id搜索出全部父级归类信息内容(yii2架构中)
public static function get_parent_list($arr,$id){
 //$arr 全部归类目录
 //$id 父级归类id
 static $list=array();
 foreach($arr as $u){
 if($u[ id ]== $id){//父级归类id相当于所搜索的id
 $list[]=$u;
 if($u[ parent_id ] 0){
 self::get_parent_list($arr,$u[ parent_id ]);
 return $list;
那样能够把归类信息内容存储到缓存文件里,而不用递归查寻。 
方式二:递归查寻取归类信息内容
 public static function get_parents($id){
 static $list = [];
 $cat_data = Category::findOne($id)- toarray();
 if($cat_data){
 $list[] = $cat_data;
 $id = $cat_data[ parent_id ];
 if($cat_data[ parent_id ] 0){
 self::get_parents($id);
 return $list;
因为必须完成无尽级归类,因此大家必须了解它的子频道有哪些?
最终完成的数字能量数组是那样的方式:
[php] view plain copy
Array 
 [0] = Array 
 [category_id] = 1 
 [category_name] = 有关我 
 [category_pid] = 0 
 [category_addtime] = 0 
 [category_order] = 0 
 [1] = Array 
 [category_id] = 2 
 [category_name] = 日常生活随笔 
 [category_pid] = 0 
 [category_addtime] = 0 
 [category_order] = 0 
 [2] = Array 
 [category_id] = 3 

 [category_pid] = 0 
 [category_addtime] = 0 
 [category_order] = 0 
 [category_child] = Array 
 [0] = Array 
 [category_id] = 4 
 [category_name] = Linux网络服务器 
 [category_pid] = 3 
 [category_addtime] = -28800 
 [category_order] = 1 
 [category_child] = Array 
 [0] = Array 
 [category_id] = 5 
 [category_name] = linux提升 
 [category_pid] = 4 
 [category_addtime] = 0 
 [category_order] = 0 
 [1] = Array 
 [category_id] = 6 
 [category_name] = 虚似化 
 [category_pid] = 4 
 [category_addtime] =  
 [category_order] = 0 
 [2] = Array 
 [category_id] = 7 
 [category_name] = Mysql提升与开发设计 
 [category_pid] = 4 
 [category_addtime] =  
 [category_order] = 0 
 [3] = Array 
 [category_id] = 8 
 [category_name] = 高能用与虚似化 
 [category_pid] = 4 
 [category_addtime] =  
 [category_order] = 0 
 [1] = Array 
 [category_id] = 15 
 [category_name] = Mysql 
 [category_pid] = 3 
 [category_addtime] =  
 [category_order] = 0 
 [category_child] = Array 
 [0] = Array 
 [category_id] = 16 
 [category_name] = 提升 
 [category_pid] = 15 
 [category_addtime] =  
 [category_order] = 0 
 [1] = Array 
 [category_id] = 17 
 [category_name] = Sql程序编写 
 [category_pid] = 15 
 [category_addtime] =  
 [category_order] = 8 
那麼大家从数据信息库文件取下来的二维数字能量数组怎样才可以变为上边那样的数字能量数组呢? 
大家要把下边这一二维数字能量数组完成成上边那类方式。
[php] view plain copy
$arr=array( 
 array( id = 1 , name = 北京市 , pid = 0 ), 
 array( id = 2 , name = 上海市 , pid = 0 ), 
 array( id = 3 , name = 上海浦东 , pid = 2 ), 
 array( id = 4 , name = 朝阳区 , pid = 1 ), 
 array( id = 5 , name = 广州市 , pid = 0 ), 
 array( id = 6 , name = 三里屯 , pid = 4 ), 
 array( id = 7 , name = 广东省 , pid = 5 ), 
 array( id = 8 , name = 三里 , pid = 4 ), 
 array( id = 10 , name = 小巷子 , pid = 8 ) 
第一种方式:运用数字能量数组的数据库索引与主键的id号同样来搜索子频道,最先为数字能量数组再加数据库索引:
[php] view plain copy
$arr=array( 
 1= array( id = 1 , name = 北京市 , pid = 0 ), 
 2= array( id = 2 , name = 上海市 , pid = 0 ), 
 3= array( id = 3 , name = 上海浦东 , pid = 2 ), 
 4= array( id = 4 , name = 朝阳区 , pid = 1 ), 
 5= array( id = 5 , name = 广州市 , pid = 0 ), 
 6= array( id = 6 , name = 三里屯 , pid = 4 ), 
 7= array( id = 7 , name = 广东省 , pid = 5 ), 
 8= array( id = 8 , name = 三里 , pid = 4 ), 
 10= array( id = 10 , name = 小巷子 , pid = 8 ) 
运用数据库索引的下标,分辨该频道是不是存有父频道,假如存有就把该频道放进父频道的son子数字能量数组里边 
[php] view plain copy
function generateTree($items){ 
 $tree = array(); 
 foreach($items as $item){ 
 //分辨是不是了解组的数据库索引== 
 if(isset($items[$item[ pid ]])){ //搜索数字能量数组里边是不是有该归类 如 isset($items[0]) isset($items[1]) 
 $items[$item[ pid ]][ son ][] = $items[$item[ id ]]; //上边的內容转变,$tree里边的值就转变 
 }else{ 
 $tree[] = $items[$item[ id ]]; //把他的详细地址给了$tree 
 return $tree; 
上边这一程序有一个关键难题,数字能量数组的数据库索引就是我们手动式加上的?那么我们并不能够全自动加上数字能量数组数据库索引呢?自然能够,下边这一程序就完成了,全自动为数字能量数组加上数据库索引随后再把子频道放进父频道的son数字能量数组中,观念和上边的程序是一样的
[php] view plain copy
function make_tree($list,$pk= id ,$pid= pid ,$child= _child ,$root=0){ 
 $tree=array(); 
 $packData=array(); 
 foreach ($list as $data) { 
 span >

依据一个归类id 获得这一归类下边全部子归类的产品信息内容,依据下边方式查寻出全部相关归类id 再 依据这种id去产品表中查寻全部产品信息内容
 * 检验该归类下全部子归类,并輸出ID(包含自身)
 * 数据信息库字段名 catid pid
function getChildrenIds ($sort_id){
 include_once APPPATH. / ;
 $db = new Db();
 $ids = $sort_id;
 $sql = SELECT catid,pid FROM jy_category WHERE pid = .$sort_id;
 $result = $db- select($sql);
 if ($result){
 foreach ($result as $key= $val){
 $ids .= , .$val[ catid ]. , ;
 $ids .= getChildrenIds ($val[ catid ]);
 $idsArr = explode( , ,$ids);
 $idsArr = array_unique($idsArr);
 $ids = implode( , ,$idsArr);
 return $ids;

$sql = SELECT * FROM t_dept WHERE `parent_id` = {$sort_id} ; $query = $db- query($sql); $result = $query- result_array(); if ($result) foreach ($result as $key= $val) $ids .= , .$val[ id ]; $ids .= $this- getChildrenIds ($val[ id ]); return $ids; 上边的查寻数据信息库频次过多了 随后下边这一就行一点,三级归类数最多查寻三次
$sql = SELECT catid,pid FROM jy_category WHERE pid in({$sort_id}) ; $result =$this- db- select($sql); $aSort = array(); $aUnion = array(); if ($result){ foreach ($result as $key= $val){ $aSort[] = $val[ catid ]; $aUnion = $this- getChildrenIds($aSort,implode( , ,$aSort));