2013-08-27 91 views
0

我現在正在使用評論系統,我遇到了一些問題。我想提出一個分層的評論系統是這樣的:如何構建分層註釋樹?

註釋1

--comment2

---- comment4

將comment3

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

,然後使用此功能:

 
function mapTree($dataset) 
{ 
    $tree = array(); 

    foreach ($dataset as $id=>&$node) 
    { 
     if (!$node['parent_id']) 
     { 
      $tree[$id] = &$node; 
     } 
     else 
     { 
      $dataset[$node['parent_id']]['childs'][$id] = &$node; 
     } 
    } 

    return $tree; 
} 

,但如果我要評論數限制爲3或5或ETH。我沒有一棵樹更多:

例如:

 
SELECT id, parent_id, name, comment, 
     DATE_FORMAT(add_date, '%d %M %Y %H:%i') as add_date 
     FROM comments LIMIT 2 

註釋1

--comment2

我失去的是有父ID意見。

難道你能幫我解決它還是顯示一些其他方式來構建評論樹腳本?

+0

我建議物化路徑 –

+0

**對於MySQL方:**我敢肯定你會發現這篇文章非常有用:http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/。這裏都詳細解釋了這一點。 **對於PHP方面:** http://stackoverflow.com/questions/11404949/how-to-build-a-tree-in-php-having-id-parent-id-and-depth-variables –

+0

我是通過這種方法,但嘗試其他方式組織樹木工作很有趣。 – myrko

回答

0

我認爲你的代碼工作時,數據集id需要匹配節點標識符。除此之外,它似乎工作。

你我更好的按日期排序,或父母身份證。 (自動遞增ID實際上可能不是日期順序。)

如果您的SQL通過add_date具有ORDER,並且限制查詢,則稍後對較早評論的回覆可能無法放置在較早的線索中。我認爲這是你的問題。

我會問你爲什麼要在那裏限制在第一個地方?我假設它是用於評論分頁。這可能意味着允許太多評論(在這裏考慮網頁評論)。你可以有最大數量的允許提交。也許讓評論樹更易讀的一種更好的方法是使用可摺疊的線程而不是使用分頁。

您可能希望將線程/樹/主題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));