PHP无限级分类排序输出以及分级缩进思路以及解决方案[修正]
2012-03-06 13:07
155 查看
遇到这个问题几天了,终于在所有的同子项目中其它功能都做完之后,决定开始做这个
可以先看看分类结构图
其实无限级栏目就像类似的多循环结构,直到最后没有内容循环为止
也就是说,在整个栏目处理中,整个栏目关联就是靠父栏目ID来构造的
所以,我模拟了一个多级分类,如下图,id是栏目id,pid是父栏目ID
很清楚的一个随意模拟的三级目录结构
那么首先我要做的一件事,就是将顶级栏目取出来,然后通过顶级栏目获取到二级栏目
我突然发现,内容居然循环了,也就是说,我如果给循环部定义一个函数,如果这个栏目存在子栏目,那么就调用自己
为了节约整个循环时间,我并不是通过判断是否无法循环退出(貌似也很判断),而是每取出一个栏目,就删除$array的一个键,直到$array为空的时候,自然循环就终止了。
所以,整个代码循环就出来了
最后打印结果
打印出来的结果是:
2天后
终于发现了一个问题,由于要计算目录下所有的子目录,多次调用居然结果一模一样,坑爹的static,在子进程循环中是不能被注销的,而且初始化后就不叫static了,经过左思右想,决定定义一个全局变量,但是每次使用前都初始化一次,万一忘记了呢,所以,出现了下面的代码
可以先看看分类结构图
其实无限级栏目就像类似的多循环结构,直到最后没有内容循环为止
也就是说,在整个栏目处理中,整个栏目关联就是靠父栏目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; }
相关文章推荐
- php 无限级分类,超级简单的无限级分类,支持输出树状图
- php 无限级分类,超级简单的无限级分类,支持输出树状图
- php无限级分类并把末级产品展示出来的思路
- php无限级分类并把末级产品展示出来的思路
- php无限级分类并把末级产品展示出来的思路
- php树型无限级分类结构[预排序遍历树算法]
- php 无限级分类以及树型显示分类关系
- layer弹出ifream,提交之后自动关闭;无限级分类排序以及无限级分类子孙图树形展示
- php 递归 无限级分类 返回数组
- php冒泡排序实现方法,传入几个数字排序后 输出实战例子
- php非递归无限级分类.
- PHP无限级分类的实现(不使用递归)
- [Language-php]php+mysql无限级分类(非递归)
- php 实现无限分类5行代码【修正】
- php 无限级分类学习参考之对ecshop无限级分类的解析 带详细注释
- PHP实现无限级分类(不使用递归)
- php从数据库中读取编码utf-8的中文内容输出到浏览器显示问号的解决方案
- 命令行cli使用php的exec可以正常,浏览器访问无输出解决方案
- php无限分类且支持输出树状图的详细介绍
- 剑指offer 01-06解答思路以及代码(顺序数组找特定数字,替换空格字符,链表反转输出,重建二叉树,两个栈实现队列效果,旋转数组最小元素)