Получение значений таблицы в дерево - PullRequest
0 голосов
/ 13 мая 2010

Итак, у меня есть таблица такая:

id|root|kw1|kw2|kw3|kw4|kw5|name
 1|   A|  B|  C|  D|  E|  F|fileA
 2|   A|  B|   |   |   |   |fileB
 3|   B|  C|  D|  E|   |   |fileC
 4|   A|  B|   |   |   |   |fileD

(несколько сотен строк ...)

И мне нужно поместить его в дерево, как показано ниже:

*A
 *B
  -fileB
  -fileD
 *C
  *D
   *E
    *F
     -fileA
*B
 *C
  *D
   *E
    -fileC

Я почти уверен, что стол накрыт плохо, но это то, с чем мне приходится жить.

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

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

Есть ли у меня хорошие варианты или есть хорошие способы сделать это? (Примеры бонуса конечно)

1 Ответ

0 голосов
/ 13 мая 2010

Вот самое простое рабочее решение, которое я мог придумать.

Допущения:

  1. У вас есть массив массивов (ваш набор результатов);он называется $rows.
  2. Пустые значения столбца в указанном вами наборе результатов равны null.
  3. В вашем дереве нет ветвей, имена которых являются строковыми представлениями целых чисел.

Код:

$tree = array();

foreach($rows as $row) {
    // Second parameter: array of 6 items as per your sample result set
    place_in_tree($tree, array($row['root'], ... $row['kw5']), $row['file']);
}

function place_in_tree(array $tree, array $path, $item) {
    // While there are more branches to be taken in $path
    while(($branch = array_shift($path)) !== null) {
        // Create the new branch if it doesn't exist
        if(!isset($tree[$branch])) {
            $tree[$branch] = array();
        }

        // Select the subtree in that branch for the next iteration
        $tree = $tree[$branch];
    }

    // Finally, add the item
    $tree[] = $item;
}

Создает массив с вложенными массивами.Этот массив содержит несколько элементов со строковыми ключами (это «ветви» и имеют тип array) и несколько элементов с числовыми ключами (это «файлы» и имеют тип string).Дочерние массивы заполняются таким же образом.

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

Кроме того, если предположение № 3, приведенное выше, не выполняется в вашем случае, вам нужно будет немного поучаствовать таким же образом, либо выбрав не двусмысленный способ разграничить ветви и листья дерева, либовыбор другой структуры для ее представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...