作者:银杰声群当_993 | 来源:互联网 | 2018-03-21 12:23
分类表,比如category,字段有id,parentid,title,查询时,我们希望得到有层级关系的数组,就是顶级是顶级分类,然后每个分类中有个children子数组,记录它的子分类,这样...
分类表,比如category,字段有 id,parentid,title,查询时,我们希望得到有层级关系的数组,就是顶级是顶级分类,然后每个分类中有个children子数组,记录它的子分类,这样一级一级的分级数组,代码如下:
SetQuery("SELECT * FROM category ORDER BY sortorder ASC");
$dsql->Execute('parentlist');
$array = array();
$parentlist = array();
while ($rs = $dsql->getObject('parentlist')) {
if ($rs->parentid == 0) {
$parentlist[$rs->id] = (array)$rs;
} else {
$array[$rs->id] = (array)$rs;
}
}
$parentlist = cat_options($parentlist, $array); //我们求的结果数组
//$list父级分类的数组
//$array是除父级分类外的全部分类的数组
function cat_options(&$list, &$array) {
foreach ($list as $key => $arr) {
foreach ($array as $k => $value) {
if ($value['parentid'] == $arr['id']) {
$list[$key]['children'][] = $value;
unset($array[$k]);
}
}
}
foreach ($list as $key => $arr) {
if (is_array($arr['children']) && count($arr['children']) > 0) {
$list[$key]['children'] = cat_options($list[$key]['children'], $array);
}
}
return $list;
}
?>
好了现在给大家推荐一个无限分类的函数,代码如下:
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' => '武侠类'
) ,
);
?>
无限分类函数,代码如下:
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 > 0; $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->arr;
}
/**
* 散落 一维数组
*
* @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->arr;
}
}
?>
本文地址:
转载随意,但请附上文章地址:-)