Уровень рекурсии PHP - PullRequest
       3

Уровень рекурсии PHP

2 голосов
/ 22 сентября 2010

У меня есть функция рекурсии. Есть иерархическая структура пользователей. Я отправляю идентификатор пользователя в свою функцию, и он должен найти всех пользователей под этим. Функция возвращает массив всех ассоциированных пользователей. Моя задача - найти уровни этих пользователей.

Например:

        User1
       /    \
    User2   User3
   /    \    \ 
User4 User5  User6

Пользователь1 имеет уровень 0. Пользователь2, Пользователь3 имеют уровень 1. Пользователь4, Пользователь5, Пользователь6 имеют уровень 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;
}

Ответы [ 3 ]

5 голосов
/ 22 сентября 2010

Добавьте дополнительный параметр к вашей функции getAssociates():

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

и когда вы обрабатываете этот уровень дерева, сохраните $level с остальными пользовательскими данными, затем вернитесь в функцию с:

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

и когда вы первоначально вызываете функцию для запуска этого процесса, передайте 0 для $level или оставьте это поле пустым и позвольте PHP назначить значение по умолчанию (также 0).

3 голосов
/ 22 сентября 2010

Посмотрите на итераторы:

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

     print_r($it->getDepth());
}
1 голос
/ 22 сентября 2010

легко, но я не работаю в Zend, поэтому я не могу сказать вам код, но могу дать вам описание

make function

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...