2010-09-22 6 views
2

J'ai la fonction de récurrence. Il existe une structure d'utilisateurs de hiérarchie. J'envoie un identifiant d'utilisateur à ma fonction et il devrait trouver tous les utilisateurs sous ceci. La fonction renvoie un tableau de tous les utilisateurs associés. Ma tâche consiste à trouver un niveau de ces utilisateurs.Niveau de récursivité php

Par exemple:

 User1 
    / \ 
    User2 User3 
/ \ \ 
User4 User5 User6 

User1 ont le niveau 0. Utilisateur2, Utilisateur3 ont le niveau 1. Utilisateur4, User5, user6 ont le niveau 2. Comment puis-je trouver dans mon récursion? Il est mon code:

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; 
} 

Répondre

5

Ajouter un paramètre supplémentaire à votre fonction getAssociates():

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

et quand vous traitez ce niveau de l'arbre, stocker le $level avec le reste des données utilisateur, récursif puis dans la fonction avec:

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

et lorsque vous appelez d'abord le fonction pour démarrer ce processus, passer 0 pour $level, ou laisser vide et laisser PHP affecter la valeur par défaut (également 0).

1

facile, mais je ne travaille pas zend donc je ne peux pas vous dire le code, mais je peux vous donner la description

fonction make

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

et les appellent

$level = getLevel($id); 
3

Jetez un oeil à itérateurs:

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

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