2010-09-22 133 views
2

我有遞歸函數。有一個層次結構用戶結構。我發送一個用戶ID到我的功能,它應該找到這個下面的所有用戶。函數返回所有關聯用戶的數組。我的任務是找到這個用戶的級別。php遞歸級別

例如:

 User1 
    / \ 
    User2 User3 
/ \ \ 
User4 User5 User6 

用戶1擁有0級。 用戶2,用戶3級有1 用戶4,用戶5,User6有2級 如何,我覺得這在我的遞歸? 這是我的代碼:

private function getAssociates($userId) { 
    global $generation; 
    global $usersUnder; 
    if (!isset($generation)) { 
     $generation = 1; 
    } 
    $userDb   = new Lyf_DB_Table('user'); 
    $associatesSelect = $userDb->Select(); 
    $associatesSelect -> from('user', array('id'))->where('enroller_id = ?', $userId); 
    $associates  = $userDb->fetchAll($associatesSelect)->toArray(); 
    if (!empty($associates)) { 
     foreach ($associates as $associate) { 
      $usersUnder[$generation] = $associate['id']; 
      $this->getAssociates($associate['id']); 
     } 
    } 
    return $usersUnder; 
} 

回答

5

爲您的getAssociates()函數添加一個額外的參數:

private function getAssociates($userID, $level = 0) { 

,當你正在處理該樹的該級別,存儲$level與用戶數據的其餘部分,然後遞歸到與功能:

$this->getAssociates($associate['id'], $level + 1); 

,當你最初調用函數來啓動這個過程,通過0$level,或者留空,讓PHP分配默認值(也是0)。

1

容易,但我不zend的工作,所以我不能告訴你的代碼,但我可以給你介紹

化妝功能

function getLevel($id,$level=0){ 
    take from db(higher lever higher_id if exist){ 
    $level++ 
    $level = getLevel(higher_id,$level); 
    } 
    return $level;  
} 

和他們致電

$level = getLevel($id); 
3

看一看迭代器:

$user_array= array('1',array(array('2'))); 
$it = new RecursiveIteratorIterator(new RecursiveArrayIterator($user_array)); 
foreach($it as $user){ 

    print_r($it->getDepth()); 
}