发新话题
打印

一个处理无限级分类的函数

本主题由 bottle 于 2007-12-10 22:47 置顶

一个处理无限级分类的函数

表结构:
复制内容到剪贴板
代码:
CREATE TABLE `class` (
`class_id` INT( 20 ) NOT NULL DEFAULT '0' COMMENT '分类ID',
`parent_id` INT( 20 ) NOT NULL DEFAULT '0' COMMENT '父分类ID',
`class_name` VARCHAR( 30 ) NOT NULL COMMENT '分类名称'
) ENGINE = MYISAM ;
复制内容到剪贴板
代码:
<?
function arrayToTree($DbClassArray = array()){ // 整理分类
        $tree = array();
        foreach ($DbClassArray as $offset => $classInfo) {
// 如果数据库中记录了以下字段则应初始化
                $arr[$offset]['class_childnum']  = 0;
                $arr[$offset]['class_namelist']  = '';
                $arr[$offset]['class_child']     = '';
                $arr[$offset]['class_path']      = '';
                $arr[$offset]['class_layer']     = 0;
                $arr[$offset]['class_rootid']    = 0;
// 初始化 END
                $tree[$classInfo['class_id']] =& $DbClassArray[$offset]; // 将数组索引设为分类ID
                $parentId = $classInfo['parent_id'];             // 取得当前分类的父分类ID
                $nonceId  = $classInfo['class_id'];             // 取得当前分类的ID
                $nonce    =& $tree[$nonceId];              // 当前分类

                if($parentId) {                            // 如果父分类存在
                        if(!isset($tree[$parentId])) { continue; }
                        $parent   =& $tree[$parentId];             // 父分类
                        $parent['class_childnum'] = $parent['class_childnum']+1;                    // 更新父分类的子分类数
                        $parent['class_child']    = $parent['class_child'] ? $parent['class_child'].','.$nonce['class_id'] : $nonce['class_id']; // 更新父分类的子分类ID列表
                        $nonce['class_namelist']  = $parent['class_namelist'].'||'.$nonce['class_name'];  // 更新当前分类的分类名列表
                        $nonce['class_path']      = $parent['class_path'].','.$nonce['class_id'];        // 更新当前分类的分类路径
                        $layer = explode(',',$nonce['class_path']);
                        $nonce['class_layer']     = COUNT($layer)-1;          // 更新当前分类的层次
                        $nonce['class_rootid']    = $layer[1];              // 更新当前分类的根ID
                }else{
                        if(!isset($tree[$nonceId])) { continue; }
                        $nonce['class_namelist'] = $nonce['class_name'];
                        $nonce['class_path']     = '0,'.$nonce['class_id'];
                        $nonce['class_layer']    = 1;
                        $nonce['class_rootid']   = 0;
                }                                 
        }
        return $tree;
}
?>
使用方法:
复制内容到剪贴板
代码:
$DbClassArray = $db->query("SELECT * FROM class ORDER BY parent_id ASC");  // 读出分类表数据
$CacheTree = arrayToTree($DbClassArray);
print_r($CacheTree);
注意:读出分类表数据要用parent_id从小到大排(即:父分类排在前面,否则以下脚本会跳过不存在的父分类更新)
复制内容到剪贴板
代码:
if(!isset($tree[$parentId])) { continue; }
空间出租:P4 3.0+1G+RIAD 1 160G+PHP+IIS+MYSQL+MDaemon

QQ:126682182
Email:hhyisw@163.com
Home:http://www.stksky.com

TOP

发新话题