您的位置:首页 > 编程语言 > PHP开发

PHP无限级分类排序输出以及分级缩进思路以及解决方案[修正]

2012-03-06 13:07 155 查看
遇到这个问题几天了,终于在所有的同子项目中其它功能都做完之后,决定开始做这个

可以先看看分类结构图



其实无限级栏目就像类似的多循环结构,直到最后没有内容循环为止

也就是说,在整个栏目处理中,整个栏目关联就是靠父栏目ID来构造的

所以,我模拟了一个多级分类,如下图,id是栏目id,pid是父栏目ID

$array = array(
1=>0,
2=>1,
3=>2,
7=>1,
4=>0,
5=>4,
6=>5,
);


很清楚的一个随意模拟的三级目录结构

那么首先我要做的一件事,就是将顶级栏目取出来,然后通过顶级栏目获取到二级栏目

foreach($array as $k=>$v){
if($v==$pid){
$list[] = $k;
}
}


foreach($list as $k=>$v){
$clist[$v] = str_repeat('  ',0);
foreach($array as $k1=>$v1){
if($v1==$v){
$list1[] = $k;
}
}
}


我突然发现,内容居然循环了,也就是说,我如果给循环部定义一个函数,如果这个栏目存在子栏目,那么就调用自己

为了节约整个循环时间,我并不是通过判断是否无法循环退出(貌似也很判断),而是每取出一个栏目,就删除$array的一个键,直到$array为空的时候,自然循环就终止了。

所以,整个代码循环就出来了

/*
* 显示多级栏目表
* @param $array	栏目数组结构信息 array(栏目ID=>父栏目ID,)
* @param $pid		要搜索的父栏目ID 0为顶级栏目
* @param $strpad	间隔字符
* @param $padnum	要间隔的字符数量
*/
function keach(&$array,$pid=0,$pad=0,$padnum='++'){
static $clist = array();//定义一个静态数组变量,这样取出来的值可以循环添加键值对
$list = array();//初始化一个数组
foreach($array as $k=>$v){//循环分类数组,找到指定父栏目的栏目ID
if($v==$pid){
$list[] = $k;
unset($array[$k]);//找到后销毁,下一个循环就少一次判断了,直到$array为空
}
}
if(!empty($list)){//如果栏目不为空,也就是这个父栏目下面还有栏目,就要循环自身调取数据
foreach($list as $k=>$v){//以上面获取到的栏目ID为父ID,判断是否存在子栏目
//echo str_repeat($padnum,$pad).$v.'<br />';
$clist[$v] = str_repeat($padnum,$pad);
keach($array,$v,$pad+2);
}
}
return $clist;
}


最后打印结果

print_r(keach($array,0));


打印出来的结果是:

Array
(
[1] =>
[2] => ++++
[3] => ++++++++
[7] => ++++
[4] =>
[5] => ++++
[6] => ++++++++
)


2天后

终于发现了一个问题,由于要计算目录下所有的子目录,多次调用居然结果一模一样,坑爹的static,在子进程循环中是不能被注销的,而且初始化后就不叫static了,经过左思右想,决定定义一个全局变量,但是每次使用前都初始化一次,万一忘记了呢,所以,出现了下面的代码

/**
* 初始化多级栏目显示,防止递归产生值错误
* @param array $array	栏目数组结构信息 array(栏目ID=>父栏目ID,)
* @param string $pid	要搜索的父栏目ID 0为顶级栏目
* @param string $pad	间隔字符
* @param int $padnum	要间隔的字符数量
* @return array()
*/
function keach($array,$pid=0,$pad=0,$padnum='++'){
global $clist;
$clist = array();
return keachdo($array,$pid,$pad);
}

/**
* 显示多级栏目层次表
* @param array $array	栏目数组结构信息 array(栏目ID=>父栏目ID,)
* @param string $pid	要搜索的父栏目ID 0为顶级栏目
* @param string $pad	间隔字符
* @param int $padnum	要间隔的字符数量
* @return array()
*/
function keachdo($array,$pid=0,$pad=0,$padnum='++'){
global $clist;
$list = array();
foreach($array as $k=>$v){
if($v==$pid){
$list[] = $k;
unset($array[$k]);
}
}
if(!empty($list)){
foreach($list as $k=>$v){
$clist[$v] = str_repeat($padnum,$pad);
keachdo($array,$v,$pad+1);
}
}
return $clist;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: