【问题标题】:How to build Hierarchical comment tree?如何构建分层评论树?
【发布时间】:2013-08-30 12:02:37
【问题描述】:

我现在正在使用 cmets 系统,但遇到了一些问题。我正在制作一个这样的分层评论系统:

评论1

--comment2

----comment4

评论3

--comment5

我用来做这个查询:

$sql = "SELECT id, parent_id, name, comment,
    DATE_FORMAT(add_date, '%d %M %Y %H:%i') as add_date
    FROM comments  ORDER BY id DESC";

然后使用这个函数:

函数映射树($数据集) { $tree = 数组(); foreach ($dataset as $id=>&$node) { if (!$node['parent_id']) { $tree[$id] = &$node; } 别的 { $dataset[$node['parent_id']]['childs'][$id] = &$node; } } 返回$树; }

但如果我想将 cmets 的数量限制为 3 或 5 或 eth。我没有树了:

示例:

选择 id、parent_id、姓名、评论、 DATE_FORMAT(add_date, '%d %M %Y %H:%i') as add_date 来自 cmets 限制 2

评论1

--comment2

我正在丢失具有父 ID 的 cmets。

你能帮我解决它或展示一些其他方法来构建评论树脚本吗?

【问题讨论】:

标签: php sql tree comments hierarchical


【解决方案1】:

我认为要使您的代码正常工作,数据集 ID 需要与节点 ID 匹配。除此之外,它似乎有效。

您最好按日期或父母 ID 排序。 (自动递增的 id 可能实际上并不按日期顺序。)

如果您的 SQL 有一个 ORDER by add_date,并且您限制了查询,则可能无法将稍后对较早评论的回复放在较早的线程中。我认为这是你的问题。

我会问你为什么首先要在其中设置 LIMIT?我认为它是用于评论分页。这可能表明允许过多的 cmets(在这里考虑网页 cmets)。您可以有最大数量的允许提交。也许让评论树更易读的更好方法是使用可折叠线程而不是使用分页。

您可能希望将线程/树/主题 ID 添加到表中,并将相应的 WHERE 子句添加到 SQL。

我必须为您的数据集添加一个索引才能让您的代码正常工作:

<?php

// Similar format to rowsets from a database...
// node is an array containing: id, parent id, comment
$commentRows = array(
    array('a', '0', 'Hi, great stuff.'),
    array('b', 'a', 'No, not really!'),
    array('c', '0', 'Trees are good!'),
    array('d', 'b', 'That is like; your opinion man.'),
    array('e', 'c', 'Teas are good')
);

function rowsToTree($rows)
{
    $tree = array();
    $index = array(); // node id => row id

    // Build an index
    foreach($rows as $id=>&$node) {
        $index[$node[0]] = $id;
    }

    foreach ($rows as $id=>&$node)
    {
        if (!$node[1]) // No parent
        {
            $tree[] = &$node;
        }
        else // Has parent, add this as a child to parent
       {
            $parentKey = $index[$node[1]];
            $rows[$parentKey]['kids'][$id] = &$node;
        }
    }

    return $tree;
}

$data = $commentRows;

// Uncomment to emulate an SQL limit
// $chunks = array_chunk($commentData, 2);
// $data = $chunks[0];

var_dump(rowsToTree($data));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    • 2021-08-20
    • 2010-09-13
    • 1970-01-01
    • 2013-08-04
    相关资源
    最近更新 更多