您的位置:首页 > 运维架构 > 网站架构

网站栏目无限分类的呈现方法一点小改进

2014-08-04 00:11 204 查看
目前我用的是物品分类目录码类似的结构了,放弃使用以前的无限层级法。因为一般网站再大,分类也不大可能超过10层,每层100个子类已经足够用了。。但它查询子孙类和祖先类异常的简便,并且可以和tag系统紧密结合。如统计分类下的各类tag总数。传统分类法和tag结合是非常繁琐的。

这里放个以前用的略微改进版的递归函数做个备份。

古老的无限分类法大家都知道,就是根据id和父分类fid来不断的查找生成分类树,

具体看这里,到后面的优化算法思路挺不错,作为学习资料吧。。
http://www.jb51.net/article/38847.htm
我很好奇为何作者都能想到双树结构了都不去向内存和缓存方面靠拢。。

这是我以前写的一个无线分类呈现方法,主要用在后台修改分类时候用下,前台直接用缓存或静态化了。

也没优化多少,比传统的比较方法减少了一半循环而已。

关键是生成下拉菜单后就把原数组自动排列成了一个树型结构,同页面如果还想生成树结构直接for一遍输出就ok了。

贴出来做个参考。

首先把结果集放入数组:

$query=$db->query("select * from class");
$i=0;
$result_arr=array();
while($row=$query->fetch()) {
//将结果放入一个数组
$result_arr[$i]=$row;
$i++;
}


$result_arr就是整个表结果存入内存了。

然后用一个递归函数:

echo "<select>";

create_select_tree($result_arr);

echo "</select>";

/**添加栏目的栏目树下拉列表
* @param array $tree_arr mysql result arrary
* @param array $offset   ignore some index for queried
* @param int $f_id      father id
* @param int $level    level of column
*/
function create_select_tree($tree_arr,$offset=array("0"),$f_id=0,$level=0){
$total=count($tree_arr);
for($i=$offset[0];$i<$total;$i++) {
if($tree_arr[$i]["f_id"]==$f_id){
if(!$level){
echo "<option value=\"".$tree_arr[$i]["id"]."\">".$tree_arr[$i]["name"]."</option>";

}else{
echo "<option value=\"".$tree_arr[$i]["id"]."\">".str_repeat("   ",$level)."┗".$tree_arr[$i]["name"]."</option>";
}
$next_f_id=  $tree_arr[$i]['id'];
//主要是这里,输出子类完毕后,把父类的数组项移到数组头去,防止再次比较查询。并且移动后形成了深度遍历下的树型结构结果排列。offset[0]就是放了多少个.它设为一个元素的数组是为了方便递归子函数参数传递。
            $temp= $tree_arr[$i];
$tree_arr[$i]= $tree_arr[$offset[0]];
$tree_arr[$offset[0]]=$temp;
$offset[0]+=1;
create_select_tree($tree_arr,$offset,$next_f_id,$level+1);
}

}//for

}//fun



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐