首页 > 编程 > PHP > 正文

PHP无限分类(树形类)

2020-03-22 19:12:17
字体:
来源:转载
供稿:网友
复制代码 代码如下:
?php
//模拟PHP无限分类查询结果
return array(
array(
'id'= 1,
'pid'= 0,
'name'= '主页'
),
array(
'id'= 2,
'pid'= 0,
'name'= '新闻'
),
array(
'id'= 3,
'pid'= 0,
'name'= '媒体'
),
array(
'id'= 4,
'pid'= 0,
'name'= '下载'
),
array(
'id'= 5,
'pid'= 0,
'name'= '关于我们'
),
array(
'id'= 6,
'pid'= 2,
'name'= '天朝新闻'
),
array(
'id'= 7,
'pid'= 2,
'name'= '海外新闻'
),
array(
'id'= 8,
'pid'= 6,
'name'= '州官新闻'
),
array(
'id'= 9,
'pid'= 3,
'name'= '音乐'
),
array(
'id'= 10,
'pid'= 3,
'name'= '电影'
),
array(
'id'= 11,
'pid'= 3,
'name'= '小说'
),
array(
'id'= 12,
'pid'= 9,
'name'= '铃声'
),
array(
'id'= 13,
'pid'= 9,
'name'= '流行音乐'
),
array(
'id'= 14,
'pid'= 9,
'name'= '古典音乐'
),
array(
'id'= 15,
'pid'= 12,
'name'= '热门铃声'
),
array(
'id'= 16,
'pid'= 12,
'name'= '搞笑铃声'
),
array(
'id'= 17,
'pid'= 12,
'name'= 'MP3铃声'
),
array(
'id'= 18,
'pid'= 17,
'name'= '128K'
),
array(
'id'= 19,
'pid'= 8,
'name'= '娱乐新闻'
),
array(
'id'= 20,
'pid'= 11,
'name'= '穿越类'
),
array(
'id'= 21,
'pid'= 11,
'name'= '武侠类'
),
);
?
拉风归拉风,但是那些文章提供的无限分类的类相关操作有点挫,直接把对数据库操作也封装进去了。也就是别人要用你这个类,还要跟你建一样的表,真TM恶心。由于项目要用到,所以自己写了一个PHP无限分类的类(也称树形类),没有数据库的操作,只需要实例化的时候传进去结果集,也就是树形数组。再执行leaf方法或navi方法即可得到想要的结果,下面请看源码,看完之后奉上smarty模板引擎的相应的模板递归方法。复制代码 代码如下:
?php
/**
* Tree 树型类(无限分类)
*
* @author Kvoid
* @copyright http://kvoid.com
* @version 1.0
* @access html' target='_blank'>public
* @example
* $tree= new Tree($result);
* $arr=$tree- leaf(0);
* $nav=$tree- navi(15);
*/
class Tree {
private $result;
private $tmp;
private $arr;
private $already = array();
/**
* 构造函数
*
* @param array $result 树型数据表结果集
* @param array $fields 树型数据表字段,array(分类id,父id)
* @param integer $root 顶级分类的父id
*/
public function __construct($result, $fields = array('id', 'pid'), $root = 0) {
$this- result = $result;
$this- fields = $fields;
$this- root = $root;
$this- handler();
}
/**
* 树型数据表结果集处理
*/
private function handler() {
foreach ($this- result as $node) {
$tmp[$node[$this- fields[1]]][] = $node;
}
krsort($tmp);
for ($i = count($tmp); $i $i--) {
foreach ($tmp as $k = $v) {
if (!in_array($k, $this- already)) {
if (!$this- tmp) {
$this- tmp = array($k, $v);
$this- already[] = $k;
continue;
} else {
foreach ($v as $key = $value) {
if ($value[$this- fields[0]] == $this- tmp[0]) {
$tmp[$k][$key]['child'] = $this- tmp[1];
$this- tmp = array($k, $tmp[$k]);
}
}
}
}
}
$this- tmp = null;
}
$this- tmp = $tmp;
}
/**
* 反向递归
*/
private function recur_n($arr, $id) {
foreach ($arr as $v) {
if ($v[$this- fields[0]] == $id) {
$this- arr[] = $v;
if ($v[$this- fields[1]] != $this- root) $this- recur_n($arr, $v[$this- fields[1]]);
}
}
}
/**
* 正向递归
*/
private function recur_p($arr) {
foreach ($arr as $v) {
$this- arr[] = $v[$this- fields[0]];
if ($v['child']) $this- recur_p($v['child']);
}
}
/**
* 菜单 多维数组
*
* @param integer $id 分类id
* @return array 返回分支,默认返回整个树
*/
public function leaf($id = null) {
$id = ($id == null) ? $this- root : $id;
return $this- tmp[$id];
}
/**
* 导航 一维数组
*
* @param integer $id 分类id
* @return array 返回单线分类直到顶级分类
*/
public function navi($id) {
$this- arr = null;
$this- recur_n($this- result, $id);
krsort($this- arr);
return $this-
}
/**
* 散落 一维数组
*
* @param integer $id 分类id
* @return array 返回leaf下所有分类id
*/
public function leafid($id) {
$this- arr = null;
$this- arr[] = $id;
$this- recur_p($this- leaf($id));
return $this-
}
}
?
在smarty中的PHP无限分类的使用方法:复制代码 代码如下:
$result=$db- query(……);//这里查询得到结果集,注意结果集为数组
$tree= new Tree($result);
$arr=$tree- leaf(0);
$nav=$tree- navi(15);

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表