Самый легкий способ создать дерево из списка Предков

У меня есть решение для учетных записей GSuite, у которого нет суффикса "@ gmail.com". Также я думаю, что это будет работать для учетных записей GSuite с @ gmail.com, но еще не пробовал. Во-первых, у вас должны быть права изменить опцию «allos¿w менее безопасное приложение» для вашей учетной записи GSuite. Если у вас есть права (вы можете проверить их в настройках учетной записи -> безопасность), вам придется отключить «двухэтапную аутентификацию», перейти в конец страницы и установить «да», чтобы разрешить менее безопасные приложения. Это все. Если у вас нет прав для изменения этих параметров, решение для этого потока не будет работать. Установите флажок https://support.google.com/a/answer/6260879?hl=ru , чтобы внести изменения в параметр «разрешить меньше ...».

5
задан Jonathan Dobbie 29 June 2009 в 22:45
поделиться

2 ответа

Первый ключ - отсортировать результаты SQL по количеству предков. Я сделал это в PHP, так как я избегаю сложностей с многозначными числами.

Это предоставляет список узлов в том порядке, в котором они могут быть правильно вставлены.

Array
(
    [1] => Array
        (
            [0] => 1
        )

    [4] => Array
        (
            [0] => 4
            [1] => 1
        )

    [2] => Array
        (
            [0] => 2
            [1] => 1
        )

    [3] => Array
        (
            [0] => 3
            [1] => 1
            [2] => 2
        )

)

На данный момент меня не волнует ключи, только списки предков. Путь по дереву можно найти между пересечением доступных узлов и оставшихся предков.

  function add_node($ancestors, &$tree) {
    if (count($ancestors) == 1) {
      $tree[array_pop($ancestors)] = array();
      return;
    }   
    $next_node = array_intersect($ancestors, array_keys($tree));
    $this->add_node(
        array_diff($ancestors, $next_node) , 
        $tree[array_pop($next_node)]
        );  
  }
4
ответ дан 14 December 2019 в 13:44
поделиться

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

Технически перечисленная вами таблица может записывать данные в ориентированном ациклическом графе, поэтому может быть невозможно построить иерархический дерево без повторяющихся разделов.

edit:

Если бы я выполнял запросы в PHP, я бы, вероятно, просто SELECT в самой таблице без использования GROUP_CONCAT - вы все равно будете обрабатывать вещи процедурно, так почему бы просто не получить соответствующее подмножество закрывающей таблицы в ее самой сырой форме?

Обратите внимание, что закрывающая таблица не будет хранить информацию о порядке (если это важно).

Если древовидные аспекты этих иерархических данных очень важны, и у вас есть выбор, как хранить данные,

2
ответ дан 14 December 2019 в 13:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: