在PHP中递归遍历简单树

3

我有一棵简单的树,形状如下所示

    ROOT
     /\
    A  B
   /    \ 
  A1     B1
          \
           B11

这个数据存储在一个自引用的数据库表CLASSES中。

 ID |  CLASS_ID  | PARENT_ID
 ---------------------------
  1 |     ROOT   |  
  2 |     A      | ROOT
  3 |     A1     | A
  4 |     B      | ROOT
  5 |     B1     | B
  6 |     B11    | B1
 ---------------------------

等等,这只是一个例子,class_id和parent_id列是整数类型的,但我只是将它们转换成字符类型以便于理解。

然后我有一个第二个表CHILDREN,最终我想让它看起来像这样:

 ID | CLASS_ID   | CHILD_CLASS_ID
 --------------------------------
  1 |     ROOT   |  A
  2 |     ROOT   |  A1
  3 |     ROOT   |  B
  4 |     ROOT   |  B1
  5 |     ROOT   |  B11
  6 |     A      |  A1
  7 |     B      |  B1
  8 |     B      |  B11
  9 |     B1     |  B11
 ---------------------------

如果一个类比其分支中的任何类都低,那么它就是所有更高级别类的子类。我知道这绝对是一个递归问题,但我是PHP新手,真的需要一些帮助。我正在运行mysql。我还应该提到,我将向后遍历。所以我要在底部插入类。下一个要插入的类的例子是A11,然后我需要向上遍历以找到所有更高级别的类,并使它们成为A11的父类。


问题是如何迭代多维结果集或者如何首先获取结果集? - Gordon
我希望能够获取结果集,但如果我可以迭代到达每个父ID的点,那么我就可以在子表上进行插入。所以任何一种方法都适合我。 - medium
这看起来像是一个作业任务。 - Sherri
@Sherri,看起来确实像是一道作业问题,但我保证这不是。我用字母和数字给出了一个通用的例子,以便我的项目特定内容不会让任何人对我的实际问题感到困惑。 - medium
2个回答

2

希望我理解你想做的事情。你需要倒推创建子表吗?

如果你从上往下工作,可以使用MySQL的GROUP_CONCAT()来收集每个父级的所有子ID。

SELECT PARENT_ID, GROUP_CONCAT(CLASS_ID) AS CHILDREN
FROM CLASSES
GROUP BY PARENT_ID

这应该返回类似以下内容的结果:
| PARENT_ID | CHILDREN      |
-----------------------------
| ROOT      | A,A1,B,B1,B11 |
| A         | A1            |
| B         | B1,B11        |
| A1        |               |
| B1        | B11           |
| B11       |               |
-----------------------------

那么你可以将其拆分并填充到你的CHILDREN表中吗?

0

我在邻接列表的地方错误地输入了嵌套集,所以我已经将其编辑删除。 - Layke
他的第一张表是邻接表(即递归关系表)。他应该看看嵌套集合(或将两者结合起来)。当使用像Propel或Doctrine这样的PHP ORM解决方案时,使用嵌套集合非常容易。但是你提供的链接确实是必读的,它会澄清很多事情。 - wimvds

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接