理解PHP/mysql中的递归

理解PHP/mysql中的递归,php,mysql,recursion,Php,Mysql,Recursion,我试图在php/mysql中创建和理解递归 我的数据库如下所示 id | woid | parent | name ------------------------------- 1 | 1111 | 0 | pdf 2 | 1111 | 0 | docs 3 | 2222 | 0 | pdf 4 | 2222 | 0 | docs 5 | 3333 | 0 | pdf 6 | 1111 | 2 | folder1 7 |

我试图在php/mysql中创建和理解递归

我的数据库如下所示

id | woid | parent | name
-------------------------------
1  | 1111 | 0      | pdf
2  | 1111 | 0      | docs
3  | 2222 | 0      | pdf
4  | 2222 | 0      | docs
5  | 3333 | 0      | pdf
6  | 1111 | 2      | folder1
7  | 2222 | 4      | folder3
8  | 3333 | 5      | folder

我想有它的地方,如果有吨和吨的父文件夹,它将能够通过所有这些。我该怎么做呢

如果您正在寻找一种有效的方法来查找所有父节点(或超级父节点),给定层次结构中的一个节点,您将进入图论领域,这也带来了许多挑战,特别是当图形的结构在单个表中表示时,例如在您自己的情况下


查看此资源以获得良好的概述:

要让SQL返回更类似于树的结构实际上是相当困难的。相反,使用PHP重新组织SQL结果可能更有意义(而且您可以对输出进行更多的控制)

SELECT id, woid, parent, name FROM files ORDER by parent ASC;
这会让我们得到一切。然后我们遍历结果集,将结果存储到由父级设置键的数组中

$folders = array();
foreach ($resultset AS $row) {
    $row['id'] = (int)$row['id'];
    $row['parent'] = (int)$row['parent'];
    if (!$folders[$row['parent']]) $folders[$row['parent']] = array();
    $folders[$row['parent']][] = $row;
}
然后我们可以递归地输出这个数组:

function buildTree($inputArray, $parent = 0) {
    $return = array();
    foreach ($inputArray[$parent] AS $key => $row) {
        if ($inputArray[$row['id']]) {
            $row['children'] = buildTree($inputArray, $row['id']);
        }
        $return[] = $row;
    }
    return $return;
}

$myStuff = buildTree($folders);

你所说的“通读所有这些”到底是什么意思?看起来像是不久前发布的一个问题:嘿,迈克尔,这听起来是个好主意。我最初尝试的是为每个工单添加创建文件夹。所以woid代表工单ID。如果有成吨的工单呢。这会变慢吗?我不知道“吨”是什么意思。我在一家大型社交网站工作。吨对我来说意味着超过100000000行。如果你的数据集真的很大,那么重新评估你正在做的事情是有意义的。我想每年大概有1000份工作订单。每个工单3或4个文件夹每个工单平均6个文件。您计划如何显示此列表?一次只选择一个级别有意义吗?我只想显示特定工单中的目录。每个工作单都有自己的目录,所以我可能仍然可以像你那样做。只需将查询更改为“从woid=xxxx ORDER by parent ASC;的文件中选择id、woid、parent、name”