`
yeyuan
  • 浏览: 230427 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

一个无限分类类

阅读更多
这个是经过本人实践确实可以使用的。
先说下表结构。一共三个字段iClassID,iParentID,cClassName;
一个是分类的id,一个是父id,一个是分类的名字,
下面是代码:
<?php 
class Tree
{
/*
 *在这里需要注意的是,类需要传入一个数组。即分类的全部数据,是一个二维的数组
 *
 */
//分层
private  $view;
//private  $path;
private  $data=array();//id=>信息
private  $cateArray=array();//id=>pid
public function __construct($dataArray)
{
    foreach ($dataArray as $val)
    {
        $this->setNode($val['iClassID'], $val['iParentID'], $val['cClassName']);
    }
    $this->sortASC();
}
//设置树的节点
function setNode($id, $parent, $value)
{
    $parent = $parent?$parent:0;
    $this->data[$id] = $value;
    $this->cateArray[$id] = $parent;
}
/*
 * 递归实现
 * 得到id下的子树结构数组(用多维数组格式来表示树)
 * id Internet 节点id (0表示的是根节点,是虚拟的,即没有与它对应的实际信息)
 * return array 子树节点数组
 */
function getChildsTree($id=0)
{
    $childs=array();
    foreach ($this->cateArray as $child=>$parent)
    {
        if ($parent==$id)
        {
            $childs[$child]=$this->getChildsTree($child);
        }
    }
    return $childs;
}

/*
 * 递归实现
 * 得到id节点的所有后代节点
 * $id  
 * return array  索引=>id,...一维数组(顺序important)
 */
function getChilds($id=0)
{
    $childArray = array();
    $childs = $this->getChild($id);
    foreach ($childs as $child)
    {
        $childArray[]=$child;
        $childArray=array_merge($childArray,$this->getChilds($child));
    }
    return $childArray;
}

/*
 * 得到id节点的孩子节点
 * $id
 * return array 索引=>id,...一维数组
 */
function getChild($id)
{
    $childs=array();
    foreach ($this->cateArray as $child=>$parent)
    {
        if ($parent==$id)
        {
            $childs[]=$child;
        }
    }
    return $childs;
}
/*
 * 递归实现
 * 反线获得节点id的父节点
 * $id interger 不可以为0
 * return array 其父节点数组
 */
function getNodeLever($id)
{
    $parents=array();
    if (array_key_exists($this->cateArray[$id],$this->cateArray))//它的父节点,在节点树中
    {
        $parents[]=$this->cateArray[$id];
        $parents=array_merge($parents,$this->getNodeLever($this->cateArray[$id]));
    }
    return $parents;
}
/*
 * 根据所在层数得到n-1个前导格式化符号
 * $id Internet 不可以取0
 * $preStr str 填充的格式化符号
 * return str 多个格式化符号
 */
function getLayer($id,$preStr='|-')
{
    return str_repeat($preStr,count($this->getNodeLever($id)));
}
//得到id节点的信息
function getValue ($id)
{
    return $this->data[$id];
}
/*
 * id降序
 */
function sortDES()
{
    krsort($this->cateArray);
}
/*
 * id升序
 */
function sortASC()
{
    ksort($this->cateArray);
}
//下拉列表框样式,
function select($cid = 0){
	$category = $this->getChilds(0);
	//file_put_contents('log.txt',var_export($category,true));
    foreach ($category as $key=>$id)
    {
		if($cid == $id){
			$this->view .= "<option value='$id' selected='selected'>".$this->getLayer($id, '|-').$this->getValue($id)."</option>";
		}
		else{
			$this->view .= "<option value='$id'>".$this->getLayer($id, '|-').$this->getValue($id)."</option>";
		}       
    }
	return $this->view;
}
//表格样式
function view()
{
    $category = $this->getChilds(0);	
    foreach ($category as $key=>$id)
    {
       $this->view .= "<tr><td>".$this->getLayer($id, '|-').$this->getValue($id)."</td><td><a href='edit/id/$id'>编辑</a>|<a href='del/id/$id' onclick='if(confirm('是否确定删除')==false)return false;' >删除</a></td></tr>";
    }
	return $this->view;
}
//endallfunc所有函数结束
}
?>


require("Tree.php");
mysql_connect('localhost','root','');
mysql_select_db('test');
mysql_query('set names utf8');
$result = mysql_query("select * from t_class");
$data = array();
while ($row = mysql_fetch_array($result)){
    $data[] = array('iClassID'=>$row['iClassID'],'iParentID'=>$row['iParentID'],'cClassName'=>$row['cClassName']);
}

$t = new Tree($data);
this->assign('class',$t->view());//表格样式,主要是用来编辑和删除分类
$this->assign('sclass',$t->select($id));//这里需要传一个父id,当编辑的时候,以便标识此分类所在的父分类为选中状态,如果为0  则显示的是分部分类
$this->display();



<table>
    {$class}//表格样式
</table>

<select name='iParent'>
<option value='0'>---根分类---</option>
{$sclass}//下拉列表样式
</select>

最终效果如图:







  • 大小: 17 KB
  • 大小: 10.5 KB
分享到:
评论
2 楼 yeyuan 2011-07-09  
wanluoliang 写道
类很好用,不过$this->view需要在select和view中的第一句清空原有内容,否则连续调用这两个方法就有些问题。

嗯,这个我会进行相关优化,感谢提出,开博这么久,你是第一个回话的!
1 楼 wanluoliang 2011-07-06  
类很好用,不过$this->view需要在select和view中的第一句清空原有内容,否则连续调用这两个方法就有些问题。

相关推荐

    一个无限级分类 无下拉菜单无限级分类

    无限级分类意味着一个分类可以有任意数量的子分类,这些子分类又可以有它们自己的子分类,形成一个无限延伸的树状结构。这种结构非常适合那些层次关系复杂、可能需要不断扩展的场景。 在实现过程中,通常会使用自...

    漂亮的无限级分类 | 无限级分类 | 无限级管理 | 无限级样式 |多级分类

    无限级分类在IT行业中,特别是在数据管理和Web开发中是一个重要的概念。它允许组织和表示具有层级关系的数据,例如网站导航菜单、目录结构、组织架构或产品分类等。在这个场景中,“漂亮的无限级分类”可能指的是...

    php无限级分类 无限级分类

    无限级分类允许我们创建一个可以无限深度扩展的分类系统,无需预先设定最大层级。下面我们将深入探讨PHP实现无限级分类的方法、常见算法以及如何结合SQL数据库进行操作。 首先,无限级分类的核心在于每个分类都有一...

    无限级分类无限级分类无限级分类无限级分类

    1. **typeid**:这是一个整型字段,作为主键使用,用于唯一标识每一个分类节点。 2. **typename**:字符串类型字段,用于存储分类名称。 3. **parentid**:整型字段,用于存储当前分类的父分类ID。如果为0,则表示该...

    js无限级分类源码,无限分类,树型菜单,分类,

    本文将深入探讨这些概念,并结合"js无限级分类源码",即JavaScript实现的树型菜单无限分类的功能。 无限级分类是一种数据结构设计,它允许类别可以有任意多的子类,形成一个无限深度的层次结构。这种结构在实际应用...

    无限分类带数据库

    无限分类允许我们创建一个无层级限制的分类结构,使得新增分类时无需预先设定最大深度,增加了系统的灵活性。在这个"无限分类带数据库"的PHP实现中,它利用数据库存储分类数据,并且优化了查询效率,只读取一次...

    无限级分类/多级分类【左右值方式实现】

    在左右值法中,每个分类都有一个左值和一个右值,这两个值代表了该分类在整棵树中的位置。左值较小的节点通常在其父节点的左边,而右值较大的节点则在其父节点的右边。通过比较这些值,我们可以方便地进行插入、删除...

    无限级分类(数组方法)

    1. **构建无限分类数据结构**:首先,我们需要一个包含分类ID、父ID和分类名的数据源,通常来源于数据库查询。然后,我们可以通过比较每个分类的父ID与其它分类的ID,构建一个嵌套的关联数组,其中键是分类ID,值是...

    php实现无限分类php实现无限分类

    无限分类通常基于树形结构,每个节点都有一个父节点(除了根节点),并且可以有任意数量的子节点。在数据库设计中,通常会用到自引用关联,即分类表中的一个字段(如`parent_id`)引用同一表的主键,表示当前分类的...

    AjaxPro无限级分类联动

    1. 数据库设计:首先,需要设计一个能够存储无限级别分类的数据模型。通常采用自引用的方式,每个分类都有一个父分类ID,通过这个字段可以链接到上级分类,形成层级关系。例如,一个“商品分类”表,包含“ID”、...

    ASP实现无限级分类

    例如,我们可以创建一个名为`categories`的表,包含以下字段:`id`(主键)、`name`(分类名)和`parent_id`(父分类ID)。`parent_id`字段用于表示当前分类属于哪个上级分类,当`parent_id`为0时,表示顶级分类。 ...

    php无限级分类菜单类.zip

    而这些关联的数据并不复杂,其实一个优秀的后台设计,应该是无限的分类,这样,在进行二次开发时,不用再单独进行编程了,只要是功能一样,后台添加一个分类就可以了,这样就达到了功能共享了。

    asp无限级分类源代码(带数据库)+示例

    递归是通过在函数内部调用自身来处理层次结构,而自连接则是将同一个表与自身进行连接,以查找子分类。 2. **ASP与数据库交互**: ASP可以利用ADO(ActiveX Data Objects)组件与数据库进行交互,如Microsoft ...

    php 无限级分类 带分类路径

    - 数据库设计:通常需要一个包含`id`(主键)、`parent_id`(父分类ID)、`name`(分类名称)等字段的分类表。有时为了提高查询效率,还会添加额外的字段,如`path`(分类路径)或`level`(层级深度)。 - 查询优化...

    ASP带数据库无限级分类

    一个常见的设计是使用一个名为`categories`的表,包含字段如`id`(主键,唯一标识每个分类)、`name`(分类名称)、`parent_id`(父分类ID,用于表示分类层级关系)。当`parent_id`为0时,表示顶级分类;非0时,表示...

    asp.net无限级分类 TreeView

    在ASP.NET中实现无限级分类的TreeView控件,是一种常见的数据展示...通过以上步骤,你可以在ASP.NET应用程序中成功实现一个无限级分类的TreeView,为用户提供清晰、直观的层次结构展示,提高用户体验和信息查找效率。

    php+jquery无限级分类

    2. **数据库设计**:在`test.sql`中,通常会创建一个如`categories`的表,包含`id`(主键)、`name`(分类名)、`parent_id`(父分类ID)和`level`(层级)等字段。`parent_id`字段用于建立父子关系,`level`字段则...

    ajax+php+无限级分类

    对于无限级分类,通常会使用自引用的关联表,其中每个分类都有一个父分类ID字段,表示其上级分类。这样,通过递归查询或自连接查询,我们可以获取到任意级别的子分类。 文件`addshangpinlei.php`可能是一个用于添加...

    通用无限级分类的存储过程

    2. 更新:当一个分类的父分类发生变化时,存储过程需要更新该分类及其所有子分类的层级信息。这涉及到对整条分支的遍历和调整,以保持分类树的完整性和一致性。 3. 删除:删除一个分类时,不仅要从数据库中移除这个...

    php无限分类例子,源码。

    无限分类允许我们创建一个无限制深度的分类结构,使得数据的管理和检索更加灵活。以下是对这个PHP无限分类源码的详细解析。 1. **无限分类原理** 无限分类通常基于自引用关联或层级标识符(如“路径”或“深度”)...

Global site tag (gtag.js) - Google Analytics