我想要一个像这样的注释表
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
之外。
看看这些资源…
是否有一种简单的方法来查询节点的子节点?
嵌套集的思想是,您存储节点的lft
和right
边缘值,这意味着检索任何子节点非常简单,因为您只需选择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
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