PHP 用引用和递归实现无限级分类
2017-05-16 22:56:56
•
阅读
打赏
在web php开发过程中,有的网站有很多栏目,我们经常需要获取所有栏目(包括一级栏目、二级栏目、三级栏目等等),按照上下级关系形成树型结构,展示到页面上。
我们采取使用递归或者通过引用方式来实现这个功能(php中引用类似C或者C++中的指针)。
表结构设计
pid为0的记录表示为一级栏目,不为0 ,则表示该记录的上级栏目id
引用方式
1.所有待处理的数据进行包装成下标为主键id(
2.对包装的数据进行循环,如果为根节点,则将其引用添加到
/**
* 把返回的数据集转换成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 用引用和递归实现无限级分类的全部内容,欢迎大家对本文的内容的学习。
相关推荐
深度学习 -- 损失函数
深度残差网络(Deep Residual Networks (ResNets))
深度学习 -- 激活函数
神经网络训练 -- 调整学习速率
生成对抗网络(GAN)改进与发展
生成对抗网络(GAN)优点与缺点
生成对抗网络(GAN)的训练
生成对抗网络(GAN)基本原理
生成模型与判别模型