检索子对象



我想要一个像这样的注释表

id | comment | parent_id
--------------------------
1    text1        0
2    text2        1
3    text3        2
4    text4        3
5    text5        3
6    text6        5

我想构造一个数组,显示父元素和子元素的层次结构。这棵树应该回溯到不确定数量的几代。我不想使用嵌套foreach循环,因为我不确定它有多深。这就是我来这里的原因,我不确定这种问题的最佳实践是什么。我还想显示数组的深度。下面是一个例子。它与上面的表格没有关系,但希望能让你知道我需要什么。

array(
    "depth"=> 4
    "parent" => array(
        "id"=> 1,
        "comment" => "sometext1"
        "child_count" => 2,
        "children" => array(
            0 => array(
                "id" => 2
                "comment" => "sometext2",
                "child_count" => 0,
                "children" => null
            ),
            1 => array(
                "id" => 3
                "comment" => "sometext3"
                "child_count" => 1,
                "children" => array(
                    0 => array(
                        "id" => 2
                        "comment" => "sometext2",
                        "child_count" => 2,
                        "children" => array(
                            0 => array(
                                "id" => 2
                                "comment" => "sometext2",
                                "child_count" => 0,
                                "children" => null
                            ),
                            1 => array(
                                "id" => 2
                                "comment" => "sometext2",
                                "child_count" => 1,
                                "children" => array(
                                    "id" => 2
                                    "comment" => "sometext2",
                                    "child_count" => 0,
                                    "children" => null
                                )
                            )
                    )
                )
            )
        )
    )
)

我将使用foreach和做一个SQL语句来检索父/子/子。即

$sql = "SELECT * FROM comments WHERE parent = $parent_id";

我不是真的在寻找所有这些代码,只是一个伪代码解决方案。

这在PHP中很容易做到…为此,需要两个数组和两个while循环。

这段代码将按照你想要的方式创建一个树,子树的深度和数量未定。

粘贴到工作代码。

使用引用,让我们假设所有内容都保存在数组$data中,结构如下:(id, comment, parent_id),其中parent_id指向id

构建树的代码

$tree = array();
reset($data);
while (list($k, $v) = each($data))
    if (0 == ($pid = $v['parent_id']))
        $tree[$k] =& $data[$k]; else
        $data[$pid]['children'][$k] =& $data[$k];

并生成深度和子节点数。

reset($data);
while (list($k, $v) = each($data))
    if (0 != $v['parent_id'])
    {
        $ref =& $data[$k];
        $depth = 0;
        do
        {
            if ($depth) $ref =& $data[$ref['parent_id']];
            $dre =& $ref['depth'];
            if (!isset($dre) || $dre <= $depth) $dre =  $depth++;
            if (isset($ref['children']))
                $ref['child_count'] = count($ref['children']);
                else
            {   
                $ref['child_count'] = 0;
                $ref['children'] = null;
            }   
        }   
        while ($ref['parent_id']);
    }

我所有的代码都是在飞行中编写的,甚至没有经过测试,所以如果有任何错误,请原谅meeeeeeee !!!!!!!!!!!←算了吧,我试过了,修复了几个问题,现在工作得很好。

<标题>注意

要使这段代码起作用,每个项的索引必须等于它的ID。

我用来尝试代码的数组。

$data = array(
    '1' => array('id' => '1', 'comment' => 'a', 'parent_id' => 0),
    '2' => array('id' => '2', 'comment' => 'b', 'parent_id' => 0),
    '3' => array('id' => '3', 'comment' => 'c', 'parent_id' => 1),
    '4' => array('id' => '4', 'comment' => 'd', 'parent_id' => 1),
    '5' => array('id' => '5', 'comment' => 'e', 'parent_id' => 2),
    '6' => array('id' => '6', 'comment' => 'f', 'parent_id' => 2),
    '7' => array('id' => '7', 'comment' => 'g', 'parent_id' => 5),
    '8' => array('id' => '8', 'comment' => 'h', 'parent_id' => 7)
    );

当您使用邻接列表试图检索层次结构中的所有子节点时,这是问题。它只是不能很好地处理递归,如果你正在使用mysql。(甲骨文则是另一回事)。

创建结构很简单,你不应该真正关心自己如何创建数组结构,首先你想尝试创建一个有效的查询和有效的模型,完美地发挥查询的类型,你将做。

例如,您说要检索所有子节点。那么你应该用nested set models来代替或者在adjacency list之外。

看看这些资源…

是否有一种简单的方法来查询节点的子节点?

嵌套集的思想是,您存储节点的lftright边缘值,这意味着检索任何子节点非常简单,因为您只需选择lft值大于目标节点lft值且小于rgt值的节点。

一旦你检索到你的结果集,创建你的数组结构将是轻而易举的。

请看这里:http://en.wikipedia.org/wiki/Nested_set_model

一旦你有了你的结果,然后看看这个问题,我问了一年左右,这正是你想要的。PHP比;从嵌套的集合模型平面数组形成多维数组

id | comment | parent_id  |   lft    |    rgt   |
-------------------------------------------------
1    World        null         1           12
2    Europe        1            2           11
3    England       2            3           10
4    Kent          3            4           5
5    Devon         3            6           9
6    Plymouth      5            7           8

相关内容

  • 没有找到相关文章

最新更新