2013-08-27 1 views
0

Я работаю теперь с системой комментариев, и я достиг некоторых проблем. Я делаю иерархическую систему комментариев, как это:Как построить иерархическое дерево комментариев?

comment1

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

comment1

--comment2

Я теряю комментарии, которые имеют родительский идентификатор.

Может ли помочь мне решить проблему или показать другой способ создания сценария дерева комментариев?

+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

Я был thnking об этом методе, но интересно попробовать другой способ организовать работу дерева. – myrko

ответ

0

Я думаю, что для того, чтобы ваш код работал, идентификаторы набора данных должны соответствовать идентификаторам узлов. Кроме того, это работает.

Вы, мой лучший заказ, по дате или родительскому идентификатору. (Автоинкрементные идентификаторы могут не соответствовать действительности.)

Если ваш SQL имеет ORDER by add_date, и вы ограничиваете запрос, более поздний ответ на более ранний комментарий может быть недоступен для размещения в более раннем потоке. Я предполагаю, что это ваша проблема.

Я бы спросил, почему вы хотите, чтобы LIMIT был там в первую очередь? Я предполагаю, что это для пейджинга комментариев. Это может свидетельствовать о том, что допускается слишком много комментариев (например, здесь рассматриваются комментарии к веб-странице). У вас может быть максимальное количество разрешенных материалов. Возможно, лучший способ сделать дерево комментариев более читаемым - это иметь разборные потоки, а не использовать пейджинг.

Возможно, вам захочется добавить нить/дерево/тему в таблицу и добавить соответствующее предложение 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)); 

 Смежные вопросы

  • Нет связанных вопросов^_^