无限分类其实描述的是成员间的上下级关系。假如一共有五个级别,针对数据描述起来就是个五维数组,这样的数组就完全没有数组的实际价值和意义。这里要讨论的是最终显示出完整的上下级关系,比如:
总经理
技术总监
项目经理A
程序员A
程序员B
项目经理B
程序员C
程序员D
程序员E
市场部总监
……
数据库里的数据一般只是用ParentId字段去指定上级,更合理的是用Level字段去描述所属等级,如果设计之初就没有Level字段,也可以通过程序去获取每条数据的层级数。可以这么来写:
/**
* private $Users = array();
* private $levelTree = array();
* $this->Users表示所有的数据
* $this->levelTree存储每条数据的层级表,每次循环之后清空
* 每个成员数据包含UserId,UserName,LeaderId
*/
private function getRelTree($id,$leaderId)
{
$this->levelTree[] = $id;
//leaderId == 0表示顶级分类
if ($leaderId != 0 && isset($this->Users[$leaderId])) {
$this->getRelTree($leaderId, $this->Users[$leaderId]['LeaderId']);
}
}
每个成员的levelTree有几条数据就表示当前数据处于第几层。知道数据所处的层级之后,就可以获取每条数据的座次。理想的数据是:
Array(
[1] => Array (
[0] => Array(
[Name] => 总经理
[LeaderId] => 0
[UserId] => 1
)
)
[2] => Array (
[0] => Array(
[Name] => 技术总监
[LeaderId] => 1
[UserId] => 2
)
[1] => Array(
[Name] => 市场总监
[LeaderId] => 1
[UserId] => 3
)
)
[3] => Array(
[0] => Array (
[Name] => 项目经理A
[LeaderId] => 2
[UserId] => 4
)
[1] => Array(
[Name] => 项目经理B
[LeaderId] => 2
[UserId] => 5
)
[2] => Array (
[Name] => 市场经理A
[LeaderId] => 3
[UserId] => 6
)
[3] => Array(
[Name] => 市场经理B
[LeaderId] => 3
[UserId] => 7
)
)
)
键值表示的就是所属层级,接下来就是要处理这些数据,来获得一个顺序数据:
private function seatData(){
$seatNum = 1;
foreach ($this->User as $key => $data) {
foreach ($data as $item) {
$item['Seat'] = $seatNum++;
$item['Space'] = $key;
$this->seatArr[$item['UserId']] = $item;
if ($key > 1) {
$leaderSeat = $this->seatArr[$item['LeaderId']]['Seat'];
$this->seatArr[$item['UserId']]['Seat'] = $leaderSeat + 1;
$this->reseat($item['UserId'], $leaderSeat);
}
}
}
}
private function reseat($userId,$leaderSeat){
foreach($this->seatArr as $key=>$item){
if($item['Seat'] > $leaderSeat && $item['UserId'] != $userId){
$this->seatArr[$key]['Seat'] = $item['Seat'] + 1;
}
}
}
$this->seatArr就是定义好每个成员的座次,可以按照这个座次重新讲数组按照座次的顺序依次排列,遍历这个数组最终就是想看到的结果。
这里的思想就是按照等级,去遍历到每一个成员,每个成员就跟在自己的上一级后面,顺序数就是上一级+1,然后把所有顺序值大于等于自己的成员顺序都+1,最终得到的数据就是完美描述整个上下级从属关系,而且依照所处的等级,可以给出对应的空格,让数据显示更直观。最终的显示结果就可以一开始我们可以看到的那样。
程序仅仅是配合思路,整个的思路就是:先要知道每个成员所处的等级,再去给所有成员做一个排列,这个排列是依据上下级的关系,这个排列值给定之后,按照这个值依次显示,就可以看到直观的成员等级图。
如果觉得《Php获取分类等级 PHP获取无限分类的完整等级列表》对你有帮助,请点赞、收藏,并留下你的观点哦!