[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Древовидные комментарии одним запросом
Vantedur
Не могу найти наиболее оптимальный вариант вывода древовидных комментариев

пока придумал вот такой способ
id1 = 1 (ответ на 0)
id2 = 2 (ответ на 0)
id3 = 1.3 (ответ на 1)
id4 = 1.4 (ответ на 1)
id5 = 1.5 (ответ на 1)
id6 = 1.4.6 (ответ на 4)
id7 = 7 (ответ на 0)
id8 = 8 (ответ на 0)
id9 = 8.9 (ответ на 8)
id10 = 8.9.10 (ответ на 9)
id11 = 8.9.10.11 (ответ на 10)
id12 = 8.12 (ответ на 8)
id13 = 13 (ответ на 0)
id14 = 14 (ответ на 0)

однако почему-то при выводе выходит что число id13 или id14 меньше чем id2
пример можно наблюдать тут
http://jquery.vtrigazety.ru/&novost=1



Спустя 1 час, 49 минут, 12 секунд (12.07.2010 - 08:12) Kuzya написал(а):
Опишите пожалуйста проблему подробнее, ничего не понятно sad.gif

Спустя 2 часа, 35 минут, 22 секунды (12.07.2010 - 10:48) Nikitian написал(а):
Сортируйте по двум полям: парент и id. Если парента нет, то ставьте парентом текущий id, иначе сортировка выдаст совсем не то, что надо.

Спустя 9 минут, 42 секунды (12.07.2010 - 10:57) ssa написал(а):
Я решил такую проблему добавлением нулей.
id1 = 001 (ответ на 0)
id2 = 002 (ответ на 0)
id3 = 001.003 (ответ на 1)
...
id13 = 013 (ответ на 0)
id14 = 014 (ответ на 0)

Этот вариант будет работать до id 999, если нужно больше то еще нули добавлять.

Спустя 19 часов, 20 минут, 51 секунда (13.07.2010 - 06:18) Vantedur написал(а):
что-то не выходит вот это толком заюзать, ктонить юзал?
http://www.tommylacroix.com/2008/09/10/php...uilding-a-tree/

Хочется древовидные комментарии позволяющие древо выводить вплоть до 50 шагов ато и больше но что-то пока не особо выходит.

хоть я пока такие большие деревья не встречал кроме как на лепре но коль такие комментарии выстраиваются там то и в любом другом месте они вполне могут быть

Быть может есть у кого отличное древо?

то что пока получается
<?php


$body = array();

$query = mysql_query("SELECT * FROM comments");

$dataset = array();
$i = 1;
while ($check = mysql_fetch_array($query)) {

$id = $check['id'];
$parent = $check['parent'];
$comment = $check['comment'];

if ($parent == 0) $parent = null;

$dataset[$i] = array(
'id'=>$id,
'parent'=>$parent,
'comment'=>$comment
);
$i++;
}

$body = mapTree($dataset);
display_tree($body);

function mapTree($dataset) {
$tree = array();
foreach ($dataset as $id=>&$node) {
if ($node['parent'] === null) {
$tree[$id] = &$node;
} else {
if (!isset($dataset[$node['parent']]['children'])) $dataset[$node['parent']]['children'] = array();
$dataset[$node['parent']]['children'][$id] = &$node;
}
}


return $tree;
}


function display_tree($nodes, $indent=0) {
if ($indent >= 20) return; // Stop at 20 sub levels

foreach ($nodes as $node) {
print str_repeat(' ',$indent*4);
22:09
print "{$node['id']}. {$node['comment']}";
print '';
if (isset($node['children']))
display_tree($node['children'],$indent+1);
}
}

?>

Спустя 12 дней, 18 часов, 6 минут, 13 секунд (26.07.2010 - 00:24) Vantedur написал(а):
в общем трабл такой, троит первый комментарий добавленный в пост. тоесть в бд 1 а на сайте выводит какую-то ботву
код вывода скрипта

<?
$query = mysql_query("SELECT * FROM ******* WHERE `unswer`='".$_GET['novost']."'");

$dataset = array();

while($check = mysql_fetch_array($query)) {
$autor = $check['autor'];
$data = $check['data'];
$mama = $check['id'];
$parent = $check['postnumb'];
if ($parent == 0) $parent = null;

$dataset['id'] = $check['id'];
$dataset[$check['id']]['mama'] = $mama;
$dataset[$check['id']]['data'] = $data;
$dataset[$check['id']]['parent'] = $parent;
$dataset[$check['id']]['text'] = $check['comment'];
}

$tree = mapTree($dataset);
display_tree($tree);

function mapTree($dataset) {
$tree = array();
foreach ($dataset as $id=>&$node) {
if ($node['parent'] === null) {
$tree[$id] = &$node;
} else {
if (!isset($dataset[$node['parent']]['children'])) $dataset[$node['parent']]['children'] = array();
$dataset[$node['parent']]['children'][$id] = &$node;
}
}


return $tree;
}
?>
<script type="text/javascript">
$(document).ready(function() {
$(".form_answer").hide();
$(".show_form_answer").click(function() {
$(this).parent().find('.form_answer').slideToggle();
})
})
</
script>
<?php
function
display_tree($nodes, $indent=0) {
if ($indent >= 20) return;

foreach ($nodes as $node) {
echo '<table><tr>';
$nbsp = $indent * 30;

echo '<td width="'.$nbsp.'px" align="left"></td>';
echo '<td algin="left">'.$node['text'].'</td>';
echo "</tr><tr><td colspan='3'>";
echo ' <tr><td ><table width="'.$nbsp.'px" ></table></td><td style="width:100%; padding-bottom:10px;"><a href="" class="show_form_answer" onclick="return false;">Ответить</a>
<form class="form_answer" action="http://vtrigazety.ru/addcom.php?post='
.$_GET['novost'].'&child='.$node['mama'].'&home='.$_GET['blog'].'" method="post"><table style="width:100%;"><tr><td>
<input type="hidden" id="'
.$node['id'].'">
<textarea id="text" name="text" style="width:100%; height:200px; text-align:left;"></textarea></td></tr><tr><td>
<input type="submit" value=" добавить " /></td></tr></table>
</form></td></tr>'
;
echo "</td></tr></table>\r\n";
if (isset($node['children']))
display_tree($node['children'],$indent+1);
}
}


пример косяка http://jquery.vtrigazety.ru/&novost=1

пример с несколькими комментариями http://jquery.vtrigazety.ru/&novost=4

удивительно то что даже призраку можно ответить

бд
user posted image

Спустя 12 часов, 56 минут, 37 секунд (26.07.2010 - 13:21) demonichka написал(а):
Если комменты привязаны к какой-то статье или теме, то выбираем все сообщения для этой статьи/темы. А для красивого вывода используется рекурсивная функция.

Спустя 2 часа, 5 минут, 42 секунды (26.07.2010 - 15:27) Vantedur написал(а):
не понял

Спустя 6 часов, 48 секунд (26.07.2010 - 21:27) Stiven Rain написал(а):
Цитата (Vantedur @ 12.07.2010 - 03:23)
Не могу найти наиболее оптимальный вариант вывода древовидных комментариев

пока придумал вот такой способ
id1 = 1 (ответ на 0)
id2 = 2 (ответ на 0)
id3 = 1.3 (ответ на 1)
id4 = 1.4 (ответ на 1)
id5 = 1.5 (ответ на 1)
id6 = 1.4.6 (ответ на 4)
id7 = 7 (ответ на 0)
id8 = 8 (ответ на 0)
id9 = 8.9 (ответ на 8)
id10 = 8.9.10 (ответ на 9)
id11 = 8.9.10.11 (ответ на 10)
id12 = 8.12 (ответ на 8)
id13 = 13 (ответ на 0)
id14 = 14 (ответ на 0)

однако почему-то при выводе выходит что число id13 или id14 меньше чем id2
пример можно наблюдать тут
http://jquery.vtrigazety.ru/&novost=1



id13 и id 14 меньше чем id2, если значения сравниваются как строки посимвольно, а не как числа. Код 2 больше чем 1

Спустя 4 часа, 3 минуты, 5 секунд (27.07.2010 - 01:31) Guest написал(а):
Цитата (Stiven Rain @ 26.07.2010 - 18:27)
Цитата (Vantedur @ 12.07.2010 - 03:23)
Не могу найти наиболее оптимальный вариант вывода древовидных комментариев

пока придумал вот такой способ
id1 = 1 (ответ на 0)
id2 = 2 (ответ на 0)
id3 = 1.3 (ответ на 1)
id4 = 1.4 (ответ на 1)
id5 = 1.5 (ответ на 1)
id6 = 1.4.6 (ответ на 4)
id7 = 7 (ответ на 0)
id8 = 8 (ответ на 0)
id9 = 8.9 (ответ на 8)
id10 = 8.9.10 (ответ на 9)
id11 = 8.9.10.11 (ответ на 10)
id12 = 8.12 (ответ на 8)
id13 = 13 (ответ на 0)
id14 = 14 (ответ на 0)

однако почему-то при выводе выходит что число id13 или id14 меньше чем id2
пример можно наблюдать тут
http://jquery.vtrigazety.ru/&novost=1



id13 и id 14 меньше чем id2, если значения сравниваются как строки посимвольно, а не как числа. Код 2 больше чем 1

это грамотно работать не будет
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.