封装类:无限级分类的常用4种方法

1、无限级分类方法:组合一维数组

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 无限级分类方法:组合一维数组
public function unlimitedForLevel ($cate, $html='+  ', $pid=0, $level=0)
{
	$arr = array();
	foreach($cate as $v)
	{
		if($v['pid'] == $pid)
		{
			$v['level'] = $level + 1;
			$v['html'] = str_repeat($html, $level);
			$arr[] = $v;
			$arr = array_merge($arr, $this->unlimitedForLevel($cate, $html, $v['id'], $level+1));
		}
	}

	return $arr;
}

$arr的值:
unlimited_01

页面显示控制器代码(添加了翻页):

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public function index()
{
    // import("Org.Util.Category");
    $Cate = D('cata');
    $sortCate = new \Org\Util\Category();

    // 分页数据
    $count = $Cate->count();// 查询满足要求的总记录数
    $Page = new \Think\Page($count,10);// 实例化分页类 传入总记录数和每页显示的记录数(25)
    $show = $Page->show();// 分页显示输出

    // 进行分页数据查询 注意limit方法的参数要使用Page类的属性
    $list = $sortCate->unlimitedForLevel($Cate->limit($Page->firstRow.','.$Page->listRows)->order('sort')->select());
    $this->assign('list',$list);// 赋值数据集
    $this->assign('page',$show);// 赋值分页输出

    $this->display();
}

unlimited_02

2、无限级分类方法:组合多维数组
(常用于:导航,下拉导航)

还有另外一种方法;使用concat查询语句排序,见文章:SQL的CONCAT()函数实现无限级分类排序

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 无限级分类方法:组合多维数组
public function unlimitedForLayer ($cate, $pid=0)
{
	$arr = array();

	foreach($cate as $v)
	{
		if ($v['pid'] == $pid) {
			$v['child'] = $this->unlimitedForLayer($cate, $v['id']);
			$arr[] = $v;
		}
	}
	return $arr;
}

unlimited_03

3、面包屑导航:传递一个子分类ID返回所有的父类

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 面包屑导航:传递一个子分类ID返回所有的父类
public function getParents ($cate, $id)
{
	$arr = array();

	foreach($cate as $val)
	{
		if($val['id'] == $id)
		{
			$arr[] = $val;
			$arr = array_merge($this->getParents($cate, $val['pid']), $arr);
		}
	}
	return $arr;
}

unlimited_04

4、传递一个父ID,列出1个分类下的所有子分类ID

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public function getChildId($cate, $pid)
{
	$arr = array();

	foreach($cate as $val)
	{
		if($val['pid'] == $pid)
		{
			$arr[] = $val['id'];
			$arr = array_merge($arr, $this->getChildId($cate, $val['id']));
		}
	}
	return $arr;
}

unlimited_05