無限分類其實描述的是成員間的上下級關係。假如一共有五個級別,針對數據描述起來就是個五維數組,這樣的數組就完全沒有數組的實際價值和意義。這裏要討論的是最終顯示出完整的上下級關係,比如:
總經理
技術總監
項目經理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,最終得到的數據就是完美描述整個上下級從屬關係,而且依照所處的等級,可以給出對應的空格,讓數據顯示更直觀。最終的顯示結果就可以一開始我們可以看到的那樣。
程序僅僅是配合思路,整個的思路就是:先要知道每個成員所處的等級,再去給所有成員做一個排列,這個排列是依據上下級的關係,這個排列值給定之後,按照這個值依次顯示,就可以看到直觀的成員等級圖。