0

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

评论1

--comment2

----评论4

评论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;
        }
    }

    返回$树;
}

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

例子:

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

评论1

--comment2

我正在丢失具有父 ID 的评论。

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

4

1 回答 1

0

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

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

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

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

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

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

<?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));
于 2014-06-05T11:43:04.823 回答