标签:
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
标签:
原文地址:http://www.cnblogs.com/subtract/p/4230145.html