如何实现嵌套注释?

时间:2012-04-29 08:55:01

标签: php html html-lists

我想在我的网站上发表评论:

<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')
);

3 个答案:

答案 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_idid键。

$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;

}

我知道它可以改进很多,但它确实有效,到目前为止我还没有发现任何错误。希望它有所帮助!