无限极分类信息

1.数据库设计:

CREATE TABLE `smar_category` (
  `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT COMMENT '栏目ID',
  `pid` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '父ID',
  `catname` varchar(30) NOT NULL COMMENT '栏目名称',
  `sort` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '排序',
  PRIMARY KEY (`id`),
  INDEX pid (pid)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

2.思路:

    ①设置pid 保存父级栏目

    ②取出所有数据

    ③调用递归函数进行排序

3.源码

  1 <?php
  2     //处理栏目
  3     class CateModel extends Model{
  4         /**
  5         *===============取出所有栏目=====================================
  6         * @param int $issort 是否进行栏目排序                            |
  7         * @param string $field 取出来的字段 如多个字段中间用,隔开        |
  8         * @param string $sort 数据排序                                     |
  9         * @return array 返回数组                                        |
 10         *================================================================
 11         */
 12         public function getAllCate($issort = true,$field = '*',$sort = 'sort ASC'){
 13             if($issort){
 14                 $rows = $this->field($field)->order($sort)->select();
 15                 $allCate = $this->getCate($rows);
 16             }else{
 17                 $allCate = $this->field($field)->order($sort)->select();
 18             }
 19             
 20             return $allCate;
 21         }
 22         /**
 23         *============栏目排序============================================
 24         * @param array $data 需要进行排序的数组                            |
 25         * @param int $parantid 父级栏目                                    |
 26         * @param int $level 对栏目进行属于第几层进行标示                |
 27         * @return array 返回排列好的数据                                |
 28         *================================================================
 29         */
 30         public function getCate($data , $parentid = 0 , $level = 0){
 31             static $rel = array();
 32             foreach($data as $k => $v){
 33                 if($v['pid'] == $parentid){
 34                     $v['level'] = $level;
 35                     $rel[] = $v;
 36                     unset($data[$k]);
 37                     $this->getCate($data,$v['id'],$level+1);
 38                 }
 39             }
 40             return $rel;
 41         }
 42 
 43         /**
 44         *=================对栏目进行数组层层递进排序=======================
 45         * @param array $data 获取的栏目                                         |
 46         * @param int $parentid 父级栏目                                         |
 47         * @return array 排序好的栏目                                         |
 48         *==================================================================
 49         */
 50         static function sortArrCate($data,$parentid = 0){
 51             $rel = array();
 52             foreach($data as $k => $v){
 53                 if($v['pid'] == $parentid){
 54                     $v['child'] =self::sortArrCate($data,$v['id']);
 55                     $rel[] = $v;
 56                 }
 57             }
 58             return $rel;
 59         }
 60         /**
 61         *=================================根据ID获取下级所有栏目信息===========================
 62         * @param array $data 获取的栏目                                                           |
 63         * @param int $id 传递父级栏目的ID                                                       |
 64         * @param char $isid 传递一个字段名称,默认为取全部的内容                                   |
 65         * @param array  返回该栏目的所有子栏目                                                   |
 66         *======================================================================================
 67         */
 68         static public function getSonCate($data,$id,$isid = ''){
 69             $rel = array();
 70             foreach($data as $k => $v){
 71                 if($v['pid'] == $id){
 72                     $rel[] = empty($isid)?$v:$v[$isid];
 73                     $rel = array_merge($rel , self::getSonCate($data,$v['id'],$isid));
 74                 }
 75             }
 76             return $rel;
 77         }
 78         /**
 79         *============================根据子栏目ID获取所有上级栏目信息==========================
 80         * @param array $data 获取的栏目                                                           |
 81         * @param int $id 传递子级栏目的ID                                                       |
 82         * @param char $isid 传递一个字段名称,默认为取全部的内容                                   |
 83         * @param array  返回该栏目的所有子栏目                                                   |
 84         *======================================================================================
 85         */
 86         static public function getParentCate($data,$id,$isid = ''){
 87             $rel = array();
 88             foreach($data as $k => $v){
 89                 if($v['id'] == $id){
 90                     $rel[] = empty($isid)?$v:$v[$isid];
 91                     $rel = array_merge(self::getParentCate($data,$v['pid'],$isid),$rel);
 92                 }
 93             }
 94             return $rel;
 95         }
 96         /**
 97         *====================修改栏目========================================
 98         * @param array $data 传递过来的POST数据                                  |
 99         * @param int $id       将要修改的栏目ID                                  |    
100         * @return boolen     返回BOOLEN值                                      |
101         * ===================================================================
102         */
103         public function exitCate($data,$id){
104             if($this->where(array('id'=>$id))->save($data)){
105                 return true;
106             }else
107                 return false;
108         }
109         /**
110         *=======================删除栏目========================
111         * @param int $id 需要删除的ID信息        
112         * ======================================================
113         */
114         public function delCate($id){
115             $data = self::getAllCate(false);
116             $sonId = self::getSonCate($data,$id,'id');
117             $this->where(array('id'=>$id))->delete();
118             foreach($sonId as $k =>$v ){
119                 $this->where(array('id'=>$v))->delete();
120             }
121         }
122     }
123 ?>

 

原文地址:https://www.cnblogs.com/subtract/p/4230145.html