Помогите разобраться в выводе древовидных комментариев.

Можешь разжевать дураку по поводу древовидных комментариев. не могу никак вникнуть в массивы.

Вот я делаю запрос (будем работать пока только с id)
таблица
id text answer

Select id from comments where answer = 0 order by id desc limit 5

создаю массив
$comm = array();
while ($row = ....)
$comm[$row['id']] = $row;

Получаю на выходе 5 комментариев

Далее мне нужно выбрать другие комментарии которые относятся к родителю

Select id from comments where id in (" . join(", ", array_keys($comm)) . ")

создаю массив
$treecomm = array();
while ($row = ...)
$treecomm[$row['id']] = $row;

А как теперь через foreach это все собрать? Т.е на выходе получить 5 родителей и под каждым все их потомки?

@темы: PHP, Вопросы

Комментарии
19.03.2011 в 15:24

Sanctus Satanas
answer — это типа ссылка на родительский элемент? Ну так цепляйте его в запросах и согласно ему прикручивайте к родителям.
19.03.2011 в 15:28

как будет выглядеть построение для вывода древовидности?
19.03.2011 в 16:13

Sanctus Satanas
Не понял вопроса. Как вывести дерево пользователю? Рекурсивной функцией.
19.03.2011 в 16:27

Да именно какое условие должно быть что бы сначала вывело родителя а под ним все комменты относящиеся к этому родителю. и так остальные все.

id 1 answer 0
--id 2 answer 1
--id 3 answer 1
id 4 answer 0
--id 5 answer 4
19.03.2011 в 19:08

Sanctus Satanas
Хорошо. Давайте сначала.
У вас есть табличка с полями:
id — идентификатор записи
parent_id — идентификатор родителя
data — какие-нибудь данные

Допустим, мы хотим построить из этого дерево. Понятно, что элементы массива могут иметь только одно значение, хоть оно и может быть массивом. Поэтому придётся как-то разделять данные самого элемента и список его потомков. Например, так:

array (
    1 => array (
        'data' => 'данные какие-нибудь',
        'subitems' => array (
            2 => array (
                'data' => 'какие-нибудь данные',
                'subitems' => array(),
            ),
        ),
    ),
)


гы, наткнулся на ограничение размера сообщения…
19.03.2011 в 19:09

Sanctus Satanas
Ok, дерево отстроили. Путешествовать по дереву логичнее всего рекурсивной функцией. Собственно, по-другому это можно сделать или используя стек — но это получится всего-лишь навсего имитация работы рекурсивной функции, — или храня эти данные внутри самого дерева (вдаваться в подробности не хочу).

Код, выводящий дерево из маркированных HTML-списков может выглядеть так:

function renderTree($tree){
    // начало списка
    echo '<ul>';

    foreach ($tree as $node){
        // начало элемента списка
        echo '<li>';

        // выводим данные
        echo '<div>' . $node['data'] . '</div>';

        // если есть потомки, проходим по ним этой же функцией
        if (isset($node['subitems'])){
            renderTree($node['subitems']);\
        }

        // конец элемента списка
        echo '</li>';
    }

    // конец списка
    echo '</ul>';
}

19.03.2011 в 19:20

Это будет действовать когда все данные выбираются? а если нужно только 5 главных и все дочерние к ним?
19.03.2011 в 19:32

Sanctus Satanas
А какая разница? Ну поставьте вы свой LIMIT 5 при первом запросе, а потом выбирайте без ограничений. Функции вывода вообще по барабану, пять там, один или пять миллионов.

P.S. Я там случайно символ лишний вставил в конце строки, где функция вызывает саму себя.
20.03.2011 в 13:14

SS а как привести массив к такому виду?

array (
1 => array (
'data' => 'данные какие-нибудь',
'subitems' => array (
2 => array (
'data' => 'какие-нибудь данные',
'subitems' => array(),
),
),
),
)
20.03.2011 в 14:56

Sanctus Satanas
Поместить в subitems элементы, у которых parent_id равен нужному id. Вы писать-то начните, там будет видно.
20.03.2011 в 14:59

а проще никак? или может можно одним запросом это сделать?
Дык писать то начал но вот не получается пока...
20.03.2011 в 15:01

Sanctus Satanas
При таком способе хранения дерева это одним запросом не сделать.
20.03.2011 в 15:03

SS ну вот я и сделал 2 запроса

в первый попадает родитель а во второй все дети родителя.

Теперь нужно объединить родителя и детей и создать зависимость.. а вот как не могу понять.
20.03.2011 в 15:10

Sanctus Satanas
$tree[(int)$row['parent_id']]['subitems'][(int)$row['id']] = $row;

Расширенная форма

Редактировать

Подписаться на новые комментарии
Получать уведомления о новых комментариях на E-mail