преобразовать мою таблицу базы данных в дерево и получить листовые узлы в php - PullRequest
0 голосов
/ 13 января 2012

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

enter image description here

в этой таблице у меня есть PreferenceID и PreferenceParentID.

в этом случае я хочу построить дерево.

уровень 1 должен быть fashion и music, потому что они имеют PreferenceParentID = 0

на 2 nd уровне men's clothing должно быть меньше fashion, потому что его идентификатор родительского предпочтения - fashion. и Artists должно быть под music.

на 3 уровне couture и denims должны быть ниже men's clothing и african и afrobeat должны быть ниже Artists.

и я хочу получить все значения узла листа . в этом случае я хочу получить

couture и denims и африканский and afrobeat`.

дерево может вырасти до n уровней.

пожалуйста, помогите мне. Любое предложение приветствуется .......................: D

Ответы [ 2 ]

2 голосов
/ 13 января 2012

В ответ на связанную статью Чаухана я хотел бы опубликовать гораздо более простое решение:

// sample data (from one big query selecting them in one go)
$rows = array(
  array('id' => 971,  'parent_id' =>   3, 'label' => 'Genres'),
  array('id' => 972,  'parent_id' =>   3, 'label' => 'Movie Stars'),
  array('id' => 1,    'parent_id' =>   0, 'label' => 'Fashion'),
  array('id' => 32,   'parent_id' =>   1, 'label' => 'Men\'s Clothing'),
  array('id' => 45,   'parent_id' =>  32, 'label' => 'Couture'),
  array('id' => 55,   'parent_id' =>  32, 'label' => 'Denims'),
  array('id' => 2,    'parent_id' =>   0, 'label' => 'Music'),
  array('id' => 970,  'parent_id' =>   2, 'label' => 'Artists'),
  array('id' => 1118, 'parent_id' => 970, 'label' => 'African'),
  array('id' => 1119, 'parent_id' => 970, 'label' => 'Afrobeat'),
);

// build map and collect ids
$map = array();
$ids = array();
foreach ($rows as $row) { // one could use the typical mysql_fetch_* stuff here 
  if (!isset($map[$row['parent_id']])) {
    $map[$row['parent_id']] = array();
  }

  $map[$row['parent_id']][] = $row;
  $ids[] = $row['id'];
}

// recursive helper display
function helper($map, $parentId = 0) {
  echo '<ul>';
  foreach ($map[$parentId] as $entry) {
    printf('<li>[%s] %s', $entry['id'], $entry['label']);
    if (isset($map[$entry['id']])) {
      helper($map, $entry['id']);
    }
    echo '</li>';
  }

  echo '</ul>';
}

// create ul
helper($map);

// the leaf nodes
print_r(
  array_diff($ids, array_keys($map))
);

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

1 голос
/ 13 января 2012

Рекурсивная функция может помочь вам создать родительское / дочернее дерево.Найти ссылку ниже для более подробной информации:

http://psoug.org/snippet/Recursive_function_to_generate_a_parentchild_tree_338.htm

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