Как вывести комментарии в виде дерева?

Lauri

Новичок
Как вывести комментарии в виде дерева?

У меня есть таблица с комментариями, где полю parent может соотвестствовать id какого-либо другого комментария, т.е. parent указывает на то, что этот комментарий нужно вывести под комментарием id с некоторым отступом. Знаю что можно сделать через массив, но одного массива тут явно не хватит, т.к. у комментария приличное колличество полей. Подкинте идею пожалуйста. :confused:
 

cDLEON

Онанист РНРСlub
В статьях на этом же сайте помоему есть мануал по работе с деревьями.
 

Lauri

Новичок
2 cDLEON, смотрел, но ответа на свой вопрос я там к сожалению не нашел

2 *****, у меня же еще текст комментария, айпи, имя пользователя, дата и т.д., я неочень понимаю как все это в один массив запихнуть, подскажите пожалуйста
 

Фанат

oncle terrible
Команда форума
текст комментария, айпи, имя пользователя и дату в массив запихивать не надо. они ведь у тебя массивом из базы иолучаются.
вот этот массив и "запихивай"
 

Фанат

oncle terrible
Команда форума
ну, с точки зрения пхп - нормальное сочетание. разве нет?
 

litvinenko

Новичок
Да, прошу прощения. Структура класса тут будет сложновата. Хотя, я толком об этом не задумывался.

2 crocodile2u:
Да вроди как нормальная конструкция слов. Только запятую забыл поставить :)
Надо было так: "Массив классов, как вариант, можно использовать."

а если по существу, то:
структура класса, я думаю, такая может быть:
PHP:
class comment
{
    private $id;
    свойство1,
    ...,
    свойство n,
    private $parent_comment

    соответствующие методы
}
в поле parent_comment можно хранить экземпляр класса comment - комментарий.

Но это будет выполняться только если комментарий может быть 1. Если у одного комментария несколько комментариев - то тогда в поле parent_comment нужно хранить массив экземпляров класса comment - комментарии.

Если я сказал глупость - простите. :)

-~{}~ 27.06.07 12:15:

ой... прошу прощения.
не parent_comment, а child_comment, конечно же
 

Фанат

oncle terrible
Команда форума
можно затдать один вопрос - а зачем?

ну, и еще один. стоит ли об этом рассказывать человеку, который не имеет представления даже о многомерных массивах?
 

litvinenko

Новичок
У меня в одной моей работе использовалась подобная структура.
Там был класс test в нем было поле questions, где хранился массив объектов типа question, в которых в свою очередь хранились массивы объектов answer.
Мне было потом очень удобно все это выводить и вообще работать с таким форматом данных.
Получалась примерно такая структура:
PHP:
array(test) => (
                  test_id,
                  ...,
                  questions => array(question) (
                                                 question_id,
                                                 ...,
                                                 answers => array(Answer) (
                                                                   answer_id,
                                                                   ...
                                                 )
                  )
)
Но тут, конечно же, как кому нравится.

Зачем рассказывать - хз. На всякий случай.
 

Фанат

oncle terrible
Команда форума
а методы в этих объектах были?
стоп. а где в этой структуре объекты-то?
 

crocodile2u

http://vbolshov.org.ru
litvinenko
если уж пишешь код - пиши его хотя бы синтаксически правильно

*****
А вот твоему замечанию я искренне удивился...

ну, с точки зрения пхп - нормальное сочетание. разве нет
То есть, с твоей точки зрения, в пхп примерно такая конструкция имеет смысл:

PHP:
$a = array(class A {}, class B {});
Имхо, у вас немного перепутались понятия класса и объекта.
 

Фанат

oncle terrible
Команда форума
а, ты об этом.
ну да, синтаксически бессмысленный вариант.
хотя все поняли, о чем речь =)
 

Lauri

Новичок
Всем спасиба, я решил это дело таким образом:
PHP:
$comments = array ();
	
$query = $db->query ("SELECT * FROM comments ..... ");
if ($db->num_rows ($query) > 0) {
	$count = $db->num_rows ($db->query ("SELECT * FROM ".DB_PEREFIX."_comments WHERE com_category = '$category' AND com_idi = '$idi'"));
		
	while ($com = $db->fetch_array ($query)) {
		$comments[$com['com_parent']][] = array ($com['com_id'], $com['com_uid'], ..............); // складываем все в массив, где значение элемента тоже будет являться массивом, а индетификатором будет id родителя
	}
	
	show ($comments[0], $comments); // показываем
			
}
function show ($arr, $comments, $level = 0) {
	if ($level >= 300) $level -= 50;
	foreach ($arr as $comm) {
		list ($id, $uid, ..............) = $comm;
		display_comment ($id, $uid, ..............); // print one comment
		if (isset ($comments[$id])) show ($comments[$id], $comments, $level+50);
	}
}
 

Lauri

Новичок
2 crocodile2u, пока нашел ошибку уже было больше половины работы проделано :)
 
Сверху