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 /** 2 * 将数据按照级别排序 3 * @return array 返回排序好的 4 */ 5 public function reSort(){ 6 //1.先取出所有的数据 7 $allCategory = $this->order(‘sort desc‘)->select(); 8 //2.调用递归函数进行排序 9 return $this->_reSort($allCategory); 10 } 11 /** 12 * 递归排序 13 * @param array $data 数组 14 * @param int $parend_id 父级 15 * @param int $level 标识当前记录是第几层的 16 * @return array 返回排序好的 17 */ 18 public function _reSort($data,$parend_id = 0,$level=0){ 19 static $_ret = array(); 20 foreach($data as $k=>$v){ 21 if($v[‘pid‘] == $parend_id){ 22 //标识当前记录是第几层的 23 $v[‘level‘] =$level; 24 $_ret[] =$v; 25 //把这条记录从数组中删除,再找子类不用循环这条记录了 26 unset($data[$k]); 27 //再找当前这条记录的所有的子类 28 $this->_reSort($data, $v[‘id‘],$level+1); 29 } 30 } 31 return $_ret; 32 }
4.删除栏目
1 /** 2 * 递归找出一个栏目的所有子栏目并且进行删除 3 * @param int $parend_id 父级 4 * @return array 返回排序好的 5 */ 6 public function getChildId($parent_id){ 7 //1.取出所有的栏目 8 $allCat = $this->order(‘sort desc‘)->select(); 9 //2.调用递归函数在所有的栏目中找子栏目 10 return $this->_findChildId($allCat, $parent_id); 11 } 12 /** 13 * 递归排序 14 * @param array $data 数组 15 * @param int $parend_id 父级 16 * @return array 返回排序好的 17 */ 18 public function _findChildId($data,$parent_id){ 19 static $ret = array(); 20 foreach($data as $k=>$v){ 21 if($v[‘pid‘] == $parent_id){ 22 $ret[] = $v[‘id‘]; 23 //把记录从元数字中删除掉,再循环记录不用在判断这条记录 24 unset($data[$k]); 25 //再找这个条记录的子栏目 26 $this->_findChildId($data,$v[‘id‘]); 27 } 28 } 29 return $ret; 30 } 31 32
时间: 2024-10-19 01:41:50