搜索
系统检测到您的用户名不符合规范:

一个原创的比较通用的生成树形结构数组的类

浏览:8073 发布日期:2013年08月09日 分类:技术分享
只做了一个核心功能,需要更多功能的请自行扩展。
描述:
假设我们网站分类表有 id(主键) , pid(父id),title,.....等属性,我们需要将所有分类按照树形结构排列,并给每个分类添加一个代表层级的lv属性。
现在我们通过 $M->select();从分类表中读出如下数据。
$list=array(
0=>array('id'=>1,'title'=>'11111','pid'=>0),
1=>array('id'=>2,'title'=>'12222','pid'=>0),
2=>array('id'=>3,'title'=>'33111','pid'=>1),
3=>array('id'=>4,'title'=>'34444','pid'=>2),
);

id为1,2的两个分类是顶级分类,它们的父分类默认为0,层级应该是1;
id为3的分类属于1的子分类,层级应该是2
id=4的是2的子分类,层级同样是2

我们希望经过处理能够形成如下的结构
$tree=array(
0=>array('id'=>1,'title'=>'11111','pid'=>0,'lv'=>1),
2=>array('id'=>3,'title'=>'33111','pid'=>1,'lv'=>2),
1=>array('id'=>2,'title'=>'12222','pid'=>0,'lv'=>1),
3=>array('id'=>4,'title'=>'34444','pid'=>2,'lv'=>2),
);
这样最终方面我们在模板中遍历输出一个有层次的分类列表。其中lv为处理过程中自动计算得到的,可以方面我们在输出的时候str_repeat生成一些划分层次的字符串,例如


通过下面的类即可实现,使用示例
helper('tree');
//关于helper函数,请参考我另外一篇文章http://www.thinkphp.cn/topic/4287.html
$tree=new tree($list,'id','pid','lv');//分别指定主键key,父id的key,以及层级key
dump($tree->tree);//获取树并打印<?php
/**
* 从数组生成树形结构
* 可指定自身主键key,父级关联key,层级key,更加灵活。
*/
class tree {
public $key;//主键id
public $pkey;//父级id
public $lvkey;//系统自动添加的,代表层级的数组key
public $list;//原始数组,二维
public $tree;//树形数组

function __construct($list,$key='id',$pkey='pid',$lvkey='lv'){
$this->list=!empty($list)?$list:array();
$this->key=$key;
$this->pkey=$pkey;
$this->lvkey=$lvkey;
$this->tree=array();
$this->GetTree();
}



/**
* 将原始数组按树型结构排序
* @staticvar int $lv 这是一个用于记录当前单元所处层级的静态变量,顶层单元从1开始
* @param type $pid 指定从哪个父级id开始
* @return bool
*/
function GetTree($pid=0){
if(empty($this->list)){
return "";
}
static $lv=0;
$lv++;
foreach($this->list as $k=>$v){
if(!isset($v[$this->key]) || !isset($v[$this->pkey])){
continue;
}
if($v[$this->pkey]==$pid){
$v[$this->lvkey]=$lv;
$this->tree[$v[$this->key]]=$v;
$this->GetTree($v[$this->key]);
}
}
$lv--;
return true;
}
}
最佳答案
评论() 相关
后面还有条评论,
评论支持使用[code][/code]标签添加代码
您需要登录后才可以评论 登录 | 立即注册
收藏
zstxt1989
积分:6535 等级:LV5
热点推荐
(追記) (追記ここまで)
最新更新

我们

合作

网站

信息

ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。

AltStyle によって変換されたページ (->オリジナル) /