描述:
假设我们网站分类表有 id(主键) , pid(父id),ti
现在我们通过 $M->select();从分类表中读出如下数据。
$list=array(
0=>array('id'=>1,'ti
1=>array('id'=>2,'ti
2=>array('id'=>3,'ti
3=>array('id'=>4,'ti
);
id为1,2的两个分类是顶级分类,它们的父分类默认为0,层级应该是1;
id为3的分类属于1的子分类,层级应该是2
id=4的是2的子分类,层级同样是2
我们希望经过处理能够形成如下的结构
$tree=array(
0=>array('id'=>1,'ti
2=>array('id'=>3,'ti
1=>array('id'=>2,'ti
3=>array('id'=>4,'ti
);
这样最终方面我们在模板中遍历输出一个有层次的分类列表。其中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;
}
} 最佳答案