Как найти ребенка любого узла в PHP MySQL? - PullRequest
2 голосов
/ 14 марта 2019

У меня есть двоичное дерево MLM, и я хочу найти всех родителей и потомков этого пользователя. Как я могу это сделать?

Например:

            A
       B         C
   D      E    F    G

По сути, я не могу создать две функции PHP MySQL, в которых одна будет возвращать всех дочерних элементов, а другая - всех родителей, бабушек и дедушек.

Моя структура таблицы:

id | my_referral_id | referral_id

my_referral_id = идентификатор моего реферала; referral_id = идентификатор реферала родителя

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

Эта работа для вас. Сначала вы должны написать запрос, чтобы получить все строки. Во-вторых, вы можете использовать рекурсивную функцию для создания родительского дочернего узла.

 function1($parentId = null,&$listData) {
            $treeData = array();
            foreach ($listData as $key => $eachNodeData) {
                if ($eachNodeData['parent_id'] == $parentId) {
                    $eachNodeData['my_id'] = $this->createTree ($listData,$eachNodeData['id']);
                    $treeData[] = $eachNodeData;
                    unset($listData[$key]);
                }
            }
            return $treeData;
         }
0 голосов
/ 14 марта 2019

У меня есть решение для этого,

Если у вас есть древовидная структура в mysql, как показано ниже,

id    |    parent_id
--------------------
1     |      0   
2     |      1
3     |      1
4     |      1
5     |      2
6     |      3
7     |      4

Затем вы можете запросить эту структуру таблицы следующим образом:

$mysqli = mysqli_connect("127.0.0.1", "dbuser", "dbpass", "dbname");

/* check connection */
if ($mysqli->connect_errno) {
    printf("Connect failed: %s\n", $mysqli->connect_error);
    exit();
}

function get_children($id = 0, $mysqli) {    
    $ch = [];
    if($id==0){
        print_r($ch);
        return;
    }
    $children = get_children_loop($id, $ch, $mysqli);
    sort($children);
    return $children;
}

function get_children_loop($id, &$ch, $mysqli) {
    $query = 'select * from mlm where parent_id = ' . $id;
    $result = mysqli_query($mysqli, $query);    
    if ($result->num_rows) {
        while($row = $result->fetch_array(MYSQLI_ASSOC)){
            $ch[] = $row['id'];
            get_children_loop($row['id'], $ch, $mysqli);
        }
    }
    return $ch;
}

function get_parents($id = 0, $mysqli) {

    $p = [];
    $parents = get_parents_loop($id, $p, $mysqli);
    sort($parents);
    return $parents;
}

function get_parents_loop($id, &$p, $mysqli) {
    $query = 'select * from mlm where id = ' . $id;
    $result = mysqli_query($mysqli, $query);
    if ($result->num_rows) {
        while($row = $result->fetch_array(MYSQLI_ASSOC)){
            if ($row['parent_id']!= 0)
                $p[] = $row['parent_id'];
            get_parents_loop($row['parent_id'], $p, $mysqli);
        }
    }
    return $p;
}

$children = get_children(1, $mysqli);
print_r($children);
$parents = get_parents(6, $mysqli);
print_r($parents);

get_children ($ id, $ mysqli) - это функция, которая принимает идентификатор и выдает всех детей и внуков за этот идентификатор.

Аналогично get_parents ($ id, $ mysqli) дает вамвсе родители, бабушки и дедушки для определенного идентификатора.

$ mysqli является объектом подключения mysqli.

Примечание: - В этом фрагменте кода используется рекурсия.

...