0

私は現在コメントシステムを使用していますが、いくつかの問題が発生しました。私はこのような階層コメントシステムを作っています:

コメント1

--コメント2

----コメント4

コメント3

--コメント5

私はこのクエリを作成するために使用します:

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

そして、この関数を使用します:

関数 mapTree( $dataset )
{
    $ツリー = 配列();

    foreach ($dataset as $id=>&$node)
    {
        if (!$node['parent_id'])
        {
            $tree[$id] = &$node;
        }
        そうしないと
       {
            $dataset[$node['parent_id']]['childs'][$id] = &$node;
        }
    }

    $ツリーを返します。
}

しかし、コメントの数を3または5またはethに制限したい場合。もうツリーはありません:

例:

SELECT ID、parent_id、名前、コメント、
        DATE_FORMAT(add_date, '%d %M %Y %H:%i') as add_date
        FROM コメント LIMIT 2

コメント1

--コメント2

親 ID を持つコメントが失われています。

それを解決したり、コメント ツリー スクリプトを作成する別の方法を教えてくれませんか?

4

1 に答える 1

0

コードが機能するには、データセット ID がノード ID と一致する必要があると思います。それ以外はうまくいくようです。

日付または親 ID で並べ替えたほうがよいでしょう。(自動インクリメント ID は、実際には日付順にならない場合があります。)

SQL に add_date による ORDER があり、クエリを制限している場合、前のコメントへの後の返信を前のスレッドに配置できない可能性があります。それはあなたの問題だと思います。

そもそもなぜそこに LIMIT を入れたいのですか?コメントページング用だと思います。これは、許可しているコメントが多すぎることを示している可能性があります (ここで Web ページのコメントを考えてみてください)。許可された提出物の最大量を持つことができます。おそらく、コメント ツリーを読みやすくするより良い方法は、ページングを使用するのではなく、折りたたみ可能なスレッドを使用することです。

おそらく、スレッド/ツリー/トピック 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));
于 2014-06-05T11:43:04.823 に答える