• php无极限分类各种方法总结


    一、数据库设计

     1 CREATE TABLE `test` 
     2 (
     3     `id` int(11) NOT NULL AUTO_INCREMENT, 
     4     `name` varchar(48) DEFAULT NULL, 
     5     `pid` int(11) DEFAULT '-1', 
     6     PRIMARY KEY (`id`)
     7 ) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;
     8 
     9 INSERT INTO `test`
    10     (`id`, `name`, `pid`) 
    11 VALUES 
    12     (1, '蔬菜', -1), 
    13     (2, '水果', -1), 
    14     (3, '肉类', -1), 
    15     (4, '猪肉', 3), 
    16     (5, '鸡肉', 3), 
    17     (6, '鸡翅', 5), 
    18     (7, '鸡腿', 5), 
    19     (8, '浆果类', 2),
    20     (9, '草莓', 8),
    21     (10, '蓝莓', 8),
    22     (11, '黑莓', 8),
    23     (12, '西兰花', 1),
    24     (13, '大白菜', 1), 
    25     (14, '韭菜', 1);
    26  

    二、方法集合

      1 /**
      2   * 版本1.0
      3   * 将标准二维数组换成树
      4   * @param  array  $list   待转换的数据集
      5   * @param  string  $pk 唯一标识字段
      6   * @param  string  $pid    父级标识字段
      7   * @param  string  $child  子集标识字段
      8   * return  array 
      9   */
     10   function getTree1($list, $pk='id', $pid='pid', $child='child', $root=-1)
     11   {
     12         $tree = array();
     13         $packData = array();
     14 
     15         //将数组转换为索引数组
     16         foreach($list as $item)
     17         {
     18             $packData[$item[$pk]]=$item;
     19         }
     20         foreach($packData as $key => $value)
     21         {
     22             if($value[$pid] == $root)
     23             {
     24                 //根节点放入
     25                 $tree[]=&$packData[$key];
     26             }
     27             else
     28             {
     29                 //子节点放入
     30                 $packData[$value[$pid]][$child][]=&$packData[$key];
     31             }
     32         }
     33        return $tree;
     34   }
     35 
     36   /**
     37   * 版本2.0
     38   * 将标准二维数组换成树与v1.0类似
     39   * @param  array  $list   待转换的数据集
     40   * @param  string  $pk 唯一标识字段
     41   * @param  string  $pid    父级标识字段
     42   * @param  string  $child  子集标识字段
     43   * return  array 
     44   */
     45    function getTree2($list, $pk='id', $pid='pid', $child='child', $root=-1)
     46    {
     47         // 创建Tree
     48         $tree = array();
     49         if(is_array($list)) 
     50         {
     51             // 创建基于主键的数组引用
     52             $refer = array();
     53             foreach ($list as $key => $data) 
     54             {
     55                 $refer[$data[$pk]] =& $list[$key];
     56             }
     57 
     58             foreach ($list as $key => $data) 
     59             {
     60                 // 判断是否存在parent
     61                 $parentId =  $data[$pid];
     62                 if ($root == $parentId)
     63                 {
     64                     $tree[] =& $list[$key];
     65                 }
     66                 else
     67                 {
     68                     if (isset($refer[$parentId])) 
     69                     {
     70                         $parent =& $refer[$parentId];
     71                         $parent[$child][] =& $list[$key];
     72                     }
     73                 }
     74             }
     75         }
     76         return $tree;
     77    }
     78 
     79    /**
     80   * 版本3.0
     81   * 将标准二维数组换成树,利用递归方式实现
     82   * @param  array  $list   待转换的数据集
     83   * @param  string  $pk 唯一标识字段
     84   * @param  string  $pid    父级标识字段
     85   * @param  string  $child  子集标识字段
     86   * return  array 
     87   */
     88    function getTree3($list, $pk='id', $pid='pid', $child='child', $root=-1)
     89    {
     90        $tree=array();
     91         foreach($list as $key=> $val){
     92 
     93             if($val[$pid]==$root){
     94                 //获取当前$pid所有子类 
     95                     unset($list[$key]);
     96                     if(! empty($list)){
     97                         $child=getTree3($list,$pk,$pid,$child,$val[$pk]);
     98                         if(!empty($child)){
     99                             $val['_child']=$child;
    100                         }                   
    101                     }              
    102                     $tree[]=$val; 
    103             }
    104         }   
    105         return $tree;
    106    }
    107 
    108 
    109    /**
    110   * 版本4.0
    111   * 将标准二维数组换成数组,利用递归方式实现
    112   * @param  array  $list   待转换的数据集
    113   * @param  string  $pk 唯一标识字段
    114   * @param  string  $pid    父级标识字段
    115   * @param  string  $child  子集标识字段
    116   * return  array 
    117   */
    118   function getTree4($list, $pid=-1, $level=1)
    119   {
    120         static $newlist = array();
    121        foreach($list as $key => $value)
    122        {
    123             if($value['pid']==$pid)
    124             {
    125                 $value['level'] = $level;
    126                 $newlist[] = $value;
    127                 unset($list[$key]);
    128                 getTree4($list, $value['id'], $level+1);
    129             }
    130        }
    131        return $newlist;
    132   }
  • 相关阅读:
    Accoridion折叠面板
    mui列表系列
    按照中文首字母排序查询表数据
    五分位算法
    springmvc添加拦截器
    springmvc添加定时任务
    通过后台解决跨域调用接口问题
    eclipse搭建ssm框架
    Java 将图片转成base64,传到前台展示
    用mysql存储过程代替递归查询
  • 原文地址:https://www.cnblogs.com/onlycat/p/7233627.html
Copyright © 2020-2023  润新知