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

表结构:

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 ;


函数:arrayToTree

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; }

Popularity: 76% [?]

Leave a Reply