PHP获取无限分类的完整等级列表

       无限分类其实描述的是成员间的上下级关系。假如一共有五个级别,针对数据描述起来就是个五维数组,这样的数组就完全没有数组的实际价值和意义。这里要讨论的是最终显示出完整的上下级关系,比如:

总经理
      技术总监
          项目经理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,最终得到的数据就是完美描述整个上下级从属关系,而且依照所处的等级,可以给出对应的空格,让数据显示更直观。最终的显示结果就可以一开始我们可以看到的那样。

程序仅仅是配合思路,整个的思路就是:先要知道每个成员所处的等级,再去给所有成员做一个排列,这个排列是依据上下级的关系,这个排列值给定之后,按照这个值依次显示,就可以看到直观的成员等级图。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值