将我的数据库表转换为树并在 php 中获取叶节点
Posted
技术标签:
【中文标题】将我的数据库表转换为树并在 php 中获取叶节点【英文标题】:convert my database table to a tree and get leaf nodes in php 【发布时间】:2012-01-13 07:43:07 【问题描述】:您好,我有一个数据库表,我想将其设置为树结构并获取该树的叶节点。
在这张表中我有PreferenceID
和PreferenceParentID
。
在这种情况下,我想建一棵树。
级别 1
应该是 fashion
和 music
,因为它们有 PreferenceParentID = 0
在2
nd 级别men's clothing
应该在fashion
之下,因为它的父首选项ID 是时尚。和 Artists
应该在 music
之下。
在3
级别couture
和denims
应该在men's clothing
和african
和afrobeat
应该在Artists
之下。
我想获得 所有叶节点值。在这种情况下,我想得到 p>
couture
和 denims
和africanand
afrobeat`。
树可以长到 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 中获取叶节点的主要内容,如果未能解决你的问题,请参考以下文章