我想在我的网站上发表评论:
<li>Parent
<ul>
<li>child one</li>
<li>child two
<ul>
<li>grandchild</li>
<li>other grandchild</li>
</ul>
</li>
</ul>
<li>Another parent with no children</li>
<li>
我已阅读the following article,但不使用<li>
。那么有没有办法像我之前用数组那样显示评论?感谢。
$comments = array(
array('id'=>1, 'parent_id'=>NULL, 'text'=>'Parent'),
array('id'=>2, 'parent_id'=>1, 'text'=>'Child'),
array('id'=>3, 'parent_id'=>2, 'text'=>'Child Third level'),
array('id'=>4, 'parent_id'=>NULL, 'text'=>'Second Parent'),
array('id'=>5, 'parent_id'=>4, 'text'=>'Second Child')
);
答案 0 :(得分:4)
我认为你的评论表有id,parent_id,comment,......我的建议是这样的;
选择您的评论;
$sql = "SELECT *FROM comments ORDER BY id DESC";
$rows = mysql_query($sql);
下一步是数组操作。您可以在下面看到以下代码并尝试使用演示here;
$rows = your_select_result;//I assumed that you have done these stuffs
$comments = $row;
/**
This is test data, please remove this array while you are
running own application.Since you will use the data one you get your db
**/
$comments = array(
1 => array('id' => 1, 'parent_id' => 0, 'childs' => array()),
2 => array('id' => 2, 'parent_id' => 0, 'childs' => array()),
3 => array('id' => 3, 'parent_id' => 0, 'childs' => array()),
5 => array('id' => 5, 'parent_id' => 0, 'childs' => array()),
11 => array('id' => 11, 'parent_id' => 0, 'childs' => array()),
17 => array('id' => 17, 'parent_id' => 0, 'childs' => array()),
23 => array('id' => 23, 'parent_id' => 0, 'childs' => array()),
28 => array('id' => 28, 'parent_id' => 0, 'childs' => array()),
4 => array('id' => 4, 'parent_id' => 1, 'childs' => array()),
6 => array('id' => 6, 'parent_id' => 1, 'childs' => array()),
8 => array('id' => 8, 'parent_id' => 2, 'childs' => array()),
9 => array('id' => 9, 'parent_id' => 2, 'childs' => array()),
7 => array('id' => 7, 'parent_id' => 3, 'childs' => array()),
12 => array('id' =>12, 'parent_id' => 7, 'childs' => array()),
13 => array('id' => 13, 'parent_id' => 12, 'childs' => array()),
);
/** Comment prepare start */
foreach ($comments as $k => &$v) {
if ($v['parent_id'] != 0) {
$comments[$v['parent_id']]['childs'][] =& $v;
}
}
unset($v);
foreach ($comments as $k => $v) {
if ($v['parent_id'] != 0) {
unset($comments[$k]);
}
}
/** Comment prepare end */
//Your indent pattern
function indent($size) {
$string = "";
for ($i = 0; $i < $size; $i++) {
$string .= "#";
}
echo $string;
}
function printComments($comments, $indent = 0) {
foreach ($comments as $comment) {
echo indent($indent + 1).' I am comment '.$comment['id']."\n";
if (!empty($comment['childs'])) {
printComments($comment['childs'], $indent + 1);
}
}
}
printComments($comments);
有关演示,请参阅here
答案 1 :(得分:1)
BTW,在使用物化路径技术的情况下,您不需要任何递归,也不需要嵌套数组或东西。
来自数据库的简单线性outpur。
要做到这一点,只需在数据库中创建一个名为path
的字段,并用所有父ID填充它,填充到一些考虑的长度。
说,示例树可能看起来像
id 1 root path
id 3 root 1 path 000000001
id 5 root 1 path 000000001000000003
id 4 root 1 path 000000001
id 2 root path 000000002
id 6 root 2 path
所以,通过简单的ORDER BY root DESC, path ASC
来查询你的表格
你将把你的树作为一个简单的已经排序的列表
答案 2 :(得分:0)
此函数只需要每个注释数组中的parent_id
和id
键。
$comments = array(
array('id'=>1, 'parent_id'=>NULL, 'text'=>'Parent'),
array('id'=>2, 'parent_id'=>1, 'text'=>'Child'),
array('id'=>3, 'parent_id'=>2, 'text'=>'Child Third level'),
array('id'=>4, 'parent_id'=>NULL, 'text'=>'Second Parent'),
array('id'=>5, 'parent_id'=>4, 'text'=>'Second Child')
);
这将返回一个多维数组。如果一个项目没有子项,则$comment['children']
将等于NULL
,否则将附加相应的子项阵列。
function arrangecomments($comments){
$tree = array();
/* We get all the parent into the tree array */
foreach ($comments as &$node) {
/* Note: I've used 0 for top level parent, you can change this to == 'NULL' */
if($node['parent_id']=='0'){
$tree[] = $node;
unset($node);
}
}
/* This is the recursive function that does the magic */
/* $k is the position in the array */
function findchildren(&$parent, &$comments, $k=0){
if (isset($comments[$k])){
if($comments[$k]['parent_id']==$parent['id']){
$com = $comments[$k];
findchildren($com, $comments); // We try to find children's children
$parent['children'][] = $com;
}
findchildren($parent, $comments, $k+1); // And move to the next sibling
}
}
/* looping through the parent array, we try to find the children */
foreach ($tree as &$parent) {
findchildren($parent, $comments);
}
return $tree;
}
我知道它可以改进很多,但它确实有效,到目前为止我还没有发现任何错误。希望它有所帮助!