无限回归问题级分类问题

一个无限级分类的处理 - 话题 - Yii Framework 中文社区
一个无限级分类的处理
3524次浏览
前几天有几个人在群里问无限级分类的问题,这几天一直没有时间贴上代码,今天与大家分享下。category.这个是无限级分类的类文件将该文件放在你的项目的扩展目录下。
* 通用的树型类,可以生成任何树型结构
class tree {
* 生成树型结构所需要的2维数组
* @var array
public $arr = array();
* 生成树型结构所需修饰符号,可以换成图片
* @var array
public $icon = array('│','├','└');
public $nbsp = &&&;
* @access private
public $ret = '';
* 构造函数,初始化类
* @param array 二维数组,例如:
1 =& array('id'=&'1','parentid'=&0,'name'=&'一级栏目一'),
2 =& array('id'=&'2','parentid'=&0,'name'=&'一级栏目二'),
3 =& array('id'=&'3','parentid'=&1,'name'=&'二级栏目一'),
4 =& array('id'=&'4','parentid'=&1,'name'=&'二级栏目二'),
5 =& array('id'=&'5','parentid'=&2,'name'=&'二级栏目三'),
6 =& array('id'=&'6','parentid'=&3,'name'=&'三级栏目一'),
7 =& array('id'=&'7','parentid'=&3,'name'=&'三级栏目二')
public function init($arr=array()){
$this-&arr = $
$this-&ret = '';
return is_array($arr);
* 获取父类级的数组
* @param int $myid
public function get_parent($myid){
$newarr = array();
if(!isset($this-&arr[$myid]))
$pid = $this-&arr[$myid]['parentid'];
$pid = $this-&arr[$pid]['parentid'];
if(is_array($this-&arr)){
foreach($this-&arr as $id =& $a){
if($a['parentid'] == $pid) $newarr[$id] = $a;
* 得到子级数组
* @param int $myid
public function get_child($myid){
$a = $newarr = array();
if(is_array($this-&arr)){
foreach($this-&arr as $id =& $a){
if($a['parentid'] == $myid) $newarr[$id] = $a;
return $newarr ? $newarr :
* 得到当前位置数组
* @param int
* @return array
public function get_pos($myid,&$newarr){
$a = array();
if(!isset($this-&arr[$myid]))
$newarr[] = $this-&arr[$myid];
$pid = $this-&arr[$myid]['parentid'];
if(isset($this-&arr[$pid])){
$this-&get_pos($pid,$newarr);
if(is_array($newarr)){
krsort($newarr);
foreach($newarr as $v){
$a[$v['id']] = $v;
return $a;
* 得到树型结构
* @param int $myid
* @param string $str 例如:&&option value=\$id \$selected&\$spacer\$name&/option&&
* @param int $sid
* @param string $adds
* @param string $str_group
public function get_tree($myid, $str, $sid = 0, $adds = '', $str_group = ''){
$number=1;
$child = $this-&get_child($myid);
if(is_array($child)){
$total = count($child);
foreach($child as $id=&$value){
if($number==$total){
$j .= $this-&icon[2];
$j .= $this-&icon[1];
$k = $adds ? $this-&icon[0] : '';
$spacer = $adds ? $adds.$j : '';
$selected = $id==$sid ? 'selected' : '';
@extract($value);
$parentid == 0 && $str_group ? eval(&\$nstr = \&$str_group\&;&) : eval(&\$nstr = \&$str\&;&);
$this-&ret .= $
$nbsp = $this-&
$this-&get_tree($id, $str, $sid, $adds.$k.$nbsp,$str_group);
$number++;
return $this-&
* 同上一方法类似,但允许多选
public function get_tree_multi($myid, $str, $sid = 0, $adds = ''){
$number=1;
$child = $this-&get_child($myid);
if(is_array($child)){
$total = count($child);
foreach($child as $id=&$a){
if($number==$total){
$j .= $this-&icon[2];
$j .= $this-&icon[1];
$k = $adds ? $this-&icon[0] : '';
$spacer = $adds ? $adds.$j : '';
$selected = $this-&have($sid,$id) ? 'selected' : '';
@extract($a);
eval(&\$nstr = \&$str\&;&);
$this-&ret .= $
$this-&get_tree_multi($id, $str, $sid, $adds.$k.'&');
$number++;
return $this-&
* @param integer $myid 要查询的ID
* @param string $str
第一种HTML代码方式
* @param string $str2
第二种HTML代码方式
* @param integer $sid
* @param integer $adds 前缀
public function get_tree_category($myid, $str, $str2, $sid = 0, $adds = ''){
$number=1;
$child = $this-&get_child($myid);
if(is_array($child)){
$total = count($child);
foreach($child as $id=&$a){
if($number==$total){
$j .= $this-&icon[2];
$j .= $this-&icon[1];
$k = $adds ? $this-&icon[0] : '';
$spacer = $adds ? $adds.$j : '';
$selected = $this-&have($sid,$id) ? 'selected' : '';
@extract($a);
if (empty($html_disabled)) {
eval(&\$nstr = \&$str\&;&);
eval(&\$nstr = \&$str2\&;&);
$this-&ret .= $
$this-&get_tree_category($id, $str, $str2, $sid, $adds.$k.'&');
$number++;
return $this-&
* 同上一类方法,jquery treeview 风格,可伸缩样式(需要treeview插件支持)
* @param $myid 表示获得这个ID下的所有子级
* @param $effected_id 需要生成treeview目录数的id
* @param $str 末级样式
* @param $str2 目录级别样式
* @param $showlevel 直接显示层级数,其余为异步显示,0为全部限制
* @param $style 目录样式 默认 filetree 可增加其他样式如'filetree treeview-famfamfam'
* @param $currentlevel 计算当前层级,递归使用 适用改函数时不需要用该参数
* @param $recursion 递归使用 外部调用时为FALSE
function get_treeview($myid,$effected_id='example',$str=&&span class='file'&\$name&/span&&, $str2=&&span class='folder'&\$name&/span&& ,$showlevel = 0 ,$style='filetree ' , $currentlevel = 1,$recursion=FALSE) {
$child = $this-&get_child($myid);
if(!defined('EFFECTED_INIT')){
$effected = ' id=&'.$effected_id.'&';
define('EFFECTED_INIT', 1);
$effected = '';
$placeholder =
'&ul&&li&&span class=&placeholder&&&/span&&/li&&/ul&';
if(!$recursion) $this-&str .='&ul'.$effected.'
class=&'.$style.'&&';
foreach($child as $id=&$a) {
@extract($a);
if($showlevel & 0 && $showlevel == $currentlevel && $this-&get_child($id)) $folder = 'hasChildren'; //如设置显示层级模式@
$floder_status = isset($folder) ? ' class=&'.$folder.'&' : '';
$this-&str .= $recursion ? '&ul&&li'.$floder_status.' id=\''.$id.'\'&' : '&li'.$floder_status.' id=\''.$id.'\'&';
$recursion = FALSE;
if($this-&get_child($id)){
eval(&\$nstr = \&$str2\&;&);
$this-&str .= $
if($showlevel == 0 || ($showlevel & 0 && $showlevel & $currentlevel)) {
$this-&get_treeview($id, $effected_id, $str, $str2, $showlevel, $style, $currentlevel+1, TRUE);
} elseif($showlevel & 0 && $showlevel == $currentlevel) {
$this-&str .= $
eval(&\$nstr = \&$str\&;&);
$this-&str .= $
$this-&str .=$recursion ? '&/li&&/ul&': '&/li&';
if(!$recursion)
$this-&str .='&/ul&';
return $this-&
* 获取子栏目json
* Enter description here ...
* @param unknown_type $myid
public function creat_sub_json($myid, $str='') {
$sub_cats = $this-&get_child($myid);
if(is_array($sub_cats)) foreach($sub_cats as $c) {
$data[$n]['id'] = iconv(CHARSET,'utf-8',$c['catid']);
if($this-&get_child($c['catid'])) {
$data[$n]['liclass'] = 'hasChildren';
$data[$n]['children'] = array(array('text'=&'&','classes'=&'placeholder'));
$data[$n]['classes'] = 'folder';
$data[$n]['text'] = iconv(CHARSET,'utf-8',$c['catname']);
if($str) {
@extract(array_iconv($c,CHARSET,'utf-8'));
eval(&\$data[$n]['text'] = \&$str\&;&);
$data[$n]['text'] = iconv(CHARSET,'utf-8',$c['catname']);
return json_encode($data);
* 此方法不知道是干什么用的哈。
* @param unknown_type $list
* @param unknown_type $item
private function have($list,$item){
return(strpos(',,'.$list.',',','.$item.','));
}&/pre&controller 代码&/p&&p&&pre class="prettyprint lang-php"& public function actionIndex()
Yii::import('ext.tree');
$tree = new tree();
$tree-&icon = array('&&│ ','&&├─ ','&&└─ ');
$tree-&nbsp = '&&';
$treeArr = array();
$menuModel = new YiiMenu();
$menuInfo = $menuModel-&findAll();
foreach($menuInfo as $r) {
$treeArr[] = array(
'id'=&$r['menu_id'],
'parentid'=&$r['menu_pid'],
'name'=&$r['menu_name'],
'menu_order'=&$r['menu_order'],
'add' =&'/blog/public/images/icon/add.png',
=& '/blog/public/images/icon/edit.png',
'del' =&'/blog/public/images/icon/del.png',
$str = &&tr&
&td align='center'&&input name='' type='text' size='3' value='\$menu_order' class='input-text-c'&&/td&
&td align='center'&\$id&/td&
&td &\$spacer\$name&/td&
&td align='center'&
&a href='/blog/menu/add/?menu_id=\$id' title='添加子菜单'&&img src='\$add'&&/a& |
&a href='/blog/menu/edit/?menu_id=\$id&menu_pid=\$parentid' title='编辑菜单'&&img src='\$edit'&&/a& |
&a href='/blog/menu/del/menu_id/\$id' title='删除'&&img src='\$del'&&/a&
$tree-&init($treeArr);
$categorys = $tree-&get_tree(0,$str);
$data = array('categorys'=&$categorys);
$this-&render('index',$data);
我察 这个鸟编辑器 有问题
共 1 条回复
你把文件打包上去下载呗
, 就不会有问题了。
这是PHPCMS V9里的
您需要登录后才可以回复。 |关于php的无限级分类 哪位大神能说说它的原理? - 知乎4被浏览353分享邀请回答1添加评论分享收藏感谢收起如何实现无限级分类表~~ - ITeye问答
我现在在做一个项目。。要用到无限级分类表。。在数据表中有3个字段。一个ID parentID name,,请问我如何实现在页面上的select标签下显示这个列表啊。。
在网上还看到一种使用编码实现的。如一级分类001 002 二级分类& 002002这个怎么实现。。他增加类型的时候代码也要增长。。请大家谁能告诉我啊。。急切盼望热心人。。。
有谁会的希望加下我QQ:& 问题补充:不用ajax。。本人没学过。。现在急需完成这功能。。有谁会的加一下我QQ。。或者留下QQ。。不甚感激。。
采纳的答案
那就用javascript 数组了,
将数据放在request 再到 jsp 生成 javavscript 数组.
//看看这个表结构
CREATE TABLE `XXX_SORT` (
`ID` varchar(32) NOT NULL,
`NAME` varchar(200) default NULL,
`LEVEL` int(3) default NULL,
`PARENT` varchar(32) default NULL,
`VERSION` int(11) default NULL,
`RELATING` varchar(32) default NULL,
PRIMARY KEY
KEY `FKEEDFA58BF12BBBC8` (`PARENT`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
这里是对应的pojo
SuppressWarnings({"serial","unused"})
@Table(name="XXX_SORT")
public class FilterSort extends IdentifiableEntity {
private FilterS
private Set&FilterSort& children = new HashSet&FilterSort&();
@OneToMany(mappedBy="parent" , cascade= CascadeType.ALL , fetch= FetchType.LAZY)
@OrderBy(value = "id ASC")
public Set&FilterSort& getChildren() {
public void setChildren(Set&FilterSort& children) {
this.children =
@Column(name="NAME",nullable=true)
public String getName() {
public void setName(String name) {
this.name =
@ManyToOne(cascade = CascadeType.REFRESH,optional=true)
@JoinColumn(name="PARENT")
public FilterSort getParent() {
public void setParent(FilterSort parent) {
this.parent =
@Column(name = "RELATING", nullable = false)
public String getRelating() {
public void setRelating(String relating) {
this.relating =
@Column(name="LEVEL" , nullable=false)
public Integer getLevel() {
public void setLevel(Integer level) {
this.level =
public Integer getVersion() {
public void setVersion(Integer version) {
this.version =
要求页面刷新吗
无限级分类设计--纯数据库实现
无限级分类的实现
主题:使用hibernate实现树形结构无限级分类
我不建议这样做,这样parentID 会无效长
引用在网上还看到一种使用编码实现的。如一级分类001 002 二级分类& 002002这个怎么实现
ID parentID name
如果是一级分类 parentID& 为0
如果是二,三 ....级分类 parentID 为他的父类ID就是了
请问我如何实现在页面上的select标签下显示这个列表啊
用ajax 啊 首先列出一级分类,再根据选择的父类去加载子类(parentID)(ajax)
已解决问题
未解决问题无限级分类新闻管理数据表设计关于无限极分类设计的几个问题
望大神指点一二 - ThinkPHP框架
数据库设计不用说了 都是这样的
这是我们假设 a是b的子分类
那么我们可以通过
index.php/a 获取a分类的所有数据
index.php/b 获取b分类的所有数据
上面这个方法我是明白的
但是一般的网站设计是下面这样,这就是我要问大家的地方
index.php/a 获取a分类的所有数据
index.php/b/a 获取b分类的子分类a的所有数据
//这就是我不明白的地方,他的数据库应该也是这么设计的,有人所这是通过路由实现的,具体怎么实现的,还望大神指点下,谢谢。
xiaoshi1991
积分:1254
ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。

我要回帖

更多关于 无限恐怖问题儿童军团 的文章

 

随机推荐