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,最終得到的數據就是完美描述整個上下級從屬關係,而且依照所處的等級,可以給出對應的空格,讓數據顯示更直觀。最終的顯示結果就可以一開始我們可以看到的那樣。

程序僅僅是配合思路,整個的思路就是:先要知道每個成員所處的等級,再去給所有成員做一個排列,這個排列是依據上下級的關係,這個排列值給定之後,按照這個值依次顯示,就可以看到直觀的成員等級圖。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章