将我的数据库表转换为树并在 php 中获取叶节点

Posted

技术标签:

【中文标题】将我的数据库表转换为树并在 php 中获取叶节点【英文标题】:convert my database table to a tree and get leaf nodes in php 【发布时间】:2012-01-13 07:43:07 【问题描述】:

您好,我有一个数据库表,我想将其设置为树结构并获取该树的叶节点。

在这张表中我有PreferenceIDPreferenceParentID

在这种情况下,我想建一棵树。

级别 1 应该是 fashionmusic ,因为它们有 PreferenceParentID = 0

2 nd 级别men's clothing 应该在fashion 之下,因为它的父首选项ID 是时尚。和 Artists 应该在 music 之下。

3 级别couturedenims 应该在men's clothingafricanafrobeat 应该在Artists 之下。

我想获得 所有叶节点值。在这种情况下,我想得到 ​​p>

couturedenims 和africanandafrobeat`。

树可以长到 n 级。

请帮助我。欢迎任何建议....................... :D

【问题讨论】:

是否可以更改该布局?如果是,请尝试:en.wikipedia.org/wiki/Nested_set_model 然后您可以使用单个查询选择叶节点。否则我会说你必须选择所有行才能找到叶子,这对于大量数据来说可能很麻烦。 【参考方案1】:

针对 Chauhan 的链接文章,我想发布一个更简单的解决方案:

// 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))
);

我还想说,如果这样的数据库结构无法避免,递归查询可能是最糟糕的事情,性能明智。

【讨论】:

【参考方案2】:

递归函数可以帮助您生成父/子树。更多详情,请查看以下链接:

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

【讨论】:

以上是关于将我的数据库表转换为树并在 php 中获取叶节点的主要内容,如果未能解决你的问题,请参考以下文章

无向图转换为树

通过 PHP 将 Sql 数据库转换为具有正确格式的 JSON,并在 PHP 脚本本身中对值进行排序

PTA列出叶节点

决策树剪枝问题

php 将节点解析为树。

如何有效地检索树中节点的路径(与帖子“将平面表解析为树?”相关)