所以,我有一个这样的表:
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我很确定这张桌子摆放得很糟糕,但这是我不得不忍受的。
我读过一些关于邻接表模型和改进的预序树遍历的内容,但我认为我的数据布局不正确。我想这需要一个递归函数,但我完全不确定该怎么做。
我对如何做到这一点持开放态度,即使这意味着将数据提取到一个新的表中来处理它。
我有没有什么好的选择或者什么好的方法呢?(当然,示例是额外的好处)
发布于 2010-05-13 11:40:14
这是我能想到的最简单的工作解决方案。
假设:
您有一个由数组组成的数组(结果集);它名为$rows.
null.
代码:
$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类型)。子数组是以同样的方式填充的。
如果你需要更接近你的业务模型,而不是一个大的喇叭数组,你可以在上面的function place_in_tree中调整分支选择和项目存储逻辑。
此外,如果上面的假设#3在您的案例中不成立,您将需要以相同的方式参与其中,要么选择一种明确的方式来区分树的分支和树叶,要么选择另一种结构来表示它。
https://stackoverflow.com/questions/2824232
复制相似问题