首页 > PHP教程 > php开发知识文章

PHP 用引用和递归实现无限级分类

在web php开发过程中,有的网站有很多栏目,我们经常需要获取所有栏目(包括一级栏目、二级栏目、三级栏目等等),按照上下级关系形成树型结构,展示到页面上。

我们采取使用递归或者通过引用方式来实现这个功能(php中引用类似C或者C++中的指针)。

表结构设计

PHP 用引用和递归实现无限级分类

pid为0的记录表示为一级栏目,不为0 ,则表示该记录的上级栏目id

 

引用方式

1.所有待处理的数据进行包装成下标为主键id(pk)的数组,便于有pid获取对应的父栏目。 

2.对包装的数据进行循环,如果为根节点,则将其引用添加到tree中,否则,将其引用添加到其父类的子元素中。

这样tree中,添加了根节点,每个根节点如果有子元素,其中包含了子元素的引用,形成树型。

/**
* 把返回的数据集转换成Tree
* @param array $list 要转换的数据集
* @param string $pk 自增字段(栏目id
* @param string $pid parent标记字段
* @param string $child child字段
* @param integer $root 根节点
* @return array
*/
function getList($list,$pk='id',$pid='pid',$child='_child',$root=0){
$tree=array();
$packData=array();
foreach ($list as $data) {
$packData[$data[$pk]] = $data;
}
foreach ($packData as $key =>$val){
if($val[$pid]==$root){
//代表跟节点
$tree[]=& $packData[$key];
}else{
//找到其父类
$packData[$val[$pid]][$child][]=& $packData[$key];
}
}
return $tree;
}

 

递归方式

/**
* 无限级分类
*/
class Category
{
/**
* 返回一维数组
* @param array $cate 要递归的数组,通过mysql获取的结果集
* @param string $html 子级分类前要显示的缩进符号。默认 '─'
* @param integer $pid 父级分类ID。默认为 0,表示顶级分类
* @param integer $level level级,配合 $html 显示足够的缩进。默认为 1,表示顶级分类
* @return array 返回一维数组
*/
public function getLevel($cate, $html = '─', $pid = 0, $level = 1)
{
$arr = array();
foreach ($cate as $v) {
if ($v['pid'] == $pid) {
$v['level'] = $level;
$v['html'] = str_repeat($html, $level - 1);
$arr[] = $v;
$arr = array_merge($arr, $this->getLevel($cate, $html, $v['id'], $level + 1));
}
}
return $arr;
}

/**
* 返回多维数组
* @param array $cate 要递归的数组,通过mysql获取的结果集
* @param string $name 子级分类在父分类数组中的 key
* @param integer $pid 父级分类ID。默认为0,表示顶级分类
* @return array 返回多维数组
*/
static public function getlayer($cate, $name = 'child', $pid = 0)
{
$arr = array();
foreach ($cate as $v) {
if ($v['pid'] == $pid) {
$v[$name] = self::getlayer($cate, $name, $v['id']);
$arr[] = $v;
}
}
return $arr;
}

/**
* 根据子分类ID返回所有父级分类
* @param [type] $cate 要递归的数组
* @param [type] $id 子分类ID
* @return array 父级分类
*/
static public function getParents($cate, $id)
{
$arr = array();
foreach ($cate as $v) {
if ($v['id'] == $id) {
$arr[] = $v;
$arr = array_merge(self::getParents($cate, $v['pid']), $arr);
}
}
return $arr;
}

/**
* 根据父级分类ID返回所有子分类ID
* @param [type] $cate 要递归的数组
* @param [type] $pid 父级分类ID
* @return array 子级分类
*/
static public function getChildrenId($cate, $pid)
{
$arr = array();
foreach ($cate as $v) {
if ($v['pid'] == $pid) {
$arr[] = $v['id'];
$arr = array_merge($arr, self::getChildrenId($cate, $v['id']));
}
}
return $arr;
}

/**
* 根据父级分类ID返回所有子级分类
* @param [type] $cate 要递归的数组
* @param [type] $pid 父级分类ID
* @return array 子级分类
*/
static public function getChildren($cate, $pid)
{
$arr = array();
foreach ($cate as $v) {
if ($v['pid'] == $pid) {
$arr[] = $v;
$arr = array_merge($arr, self::getChildren($cate, $v['id']));
}
}
return $arr;
}
}

以上就是PHP 用引用和递归实现无限级分类的全部内容,欢迎大家对本文的内容的学习。

关闭
感谢您的支持,我会继续努力!
扫码打赏,建议金额1-10元


提醒:打赏金额将直接进入对方账号,无法退款,请您谨慎操作。