2017-01-22 3 views
1

У меня есть таблица пользователей с иерархическими пользователями. Таким образом, пользователи могут иметь родительского пользователя. Я пытаюсь вернуть массив всех дочерних идентификаторов пользователя определенного пользователя. Моя функция возвращает «null». Что не так?иерархия concat tree в рекурсивной функции PHP

public function userDownline($userid, $result = array()) { 
    $dbconn = $this->DBase(); 
    $children = $dbconn->GetAll('SELECT id FROM users WHERE parent=' . (int)$userid); 
    if(count($children) > 0) { 
     foreach($children As $k=>$v) { 
      if(!in_array($v['id'], $result)) $result[] = $v['id']; 
      $this->userDownline($v['id'], $result); 
     } 
    } else { 
     return $result; 
    } 
}  

ответ

1

Конечно, он вернет null, потому что вы находитесь в блоке if (count ($ children)), и от этого нет возврата.

Я думаю, что вы должны сделать что-то вроде этого:

<?php 
public function userDownline($userid, &$result = array()) 
{ 
    $dbconn = $this->DBase(); 
    $children = $dbconn->GetAll('SELECT id FROM users WHERE parent=' . (int)$userid); 
    if (count($children) > 0) { 
     foreach ($children As $k => $v) { 
      if (!in_array($v['id'], $result)) $result[] = $v['id']; 
      $this->userDownline($v['id'], $result); 
     } 
    } 
    return $result; 
} 

Я добавил ссылку в подписи функции и перемещение возврата из условного блока.

Но это действительно тотально неэффективный способ и опасный (из-за - из памяти, слишком много уровней гнездования и других исключений).

Есть 2 лучшие способы:

  1. Использование https://neo4j.com/ - База данных Graph - лучший вариант для вашей задачи.
  2. Если вы все еще хотите использовать только Sql DB - читать о Вложенные набора Моделиhttp://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/
+0

Спасибо - я добавил «возвращение» к указанной линии - теперь я получаю первый ребенок (1 записи, вместо того, многие). – Gerfried

+0

Сайт mikehillyer потрясающий - спасибо! +1 для этого. – Gerfried

+0

Я снова посмотрел и обновил свой ответ кодом. – vuliad

Смежные вопросы