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: 70% [?]