Забыли пароль?
Запросите новый здесь.

Автор темы: Zaxap
ID темы: 2426
Информация:
Тема содержит 9 сообщения, была просмотрена 8849 раз.
Просмотр темы
PHP-Fusion Russia » Веб-разработка » PHP
 Распечатать тему
Как сделать вывод из базы данных (древовидные комментарии)
Zaxap
Здравствуйте! Почитал немного про вывод древовидных комментариев - ужаснулся малость...
Потом нашел на Toster'е ответ одного умного человека... не понял до конца, что это такое, но в голове возникла идея, и вот она:

1 //id родителя
1_1 //дочерний комментарий 1 (id комментария)
1_2 //дочерний комментарий 2
1_2_1 //внучатый комментарий 1 (дочерний комментарий для 2 дочернего комментария)
1_2_2 //внучатый комментарий 2
1_3 //дочерний комментарий 3
1_3_1 //внучатый комментарий
1_3_1_1 //правнучатый комментарий

(и т.д., и т.п.)

Только вот тут одна проблема: никоим образом не вижу, как выводить это нормально из базы данных, тем более в виде "дерева"...
Помогите, кто чем сможетab

И скажите, нормальная ли идея (мне кажется, можно сделать и получше...сейчас подумал насчет всякого рода возможных багов)...
Изменил(а) Zaxap, 07.02.2015 05:52
Зло не дремлет, а я добрый...
 
grungestranger
Я считаю, что никак нельзя, даже используя переменные mysql-ские и т.д. Поэтому надо делать это в php. Если выводить немного - то проблем нет. А если записей много, плюс разбивка по страницам, тогда скрипт может выполняться достаточно долго.

Объединено 07.02.2015 07:54:
Это делается функцией, которая вызывается сама в себе.
Изменил(а) grungestranger, 07.02.2015 07:54
 
Web
Zaxap
grungestranger, строить - понятно, что php... но тут проблема в другом: как именно разместить нормально комментарии в mysql-базе...
причем без parent_id (как понял, с pid это чревато багами)...
Зло не дремлет, а я добрый...
 
Polarfox
Ид комента + ид родителя

и вывод делаешь по порядку - те как были сделаны, а форматируешь уже в зависимости от наследования.

разве тут есть сложности?

можешь кстати IPB разобрать, довольно вменяемый форум вроде, там есть древовидные посты.
Всегда делайте backup перед изменениями | Указывайте свою версию в подписи/профиле. | Вся бесплатная тех. поддержка только на форуме

PolarLab - вход для подопытных
 
Web
Zaxap
Т.е. сделать так, как я сделал свой древовидный список услуг?..

Загрузить источник  GeSHi: PHP
  1. $result = mysql_query("SELECT 'id', 'pid', 'name', 'desc', 'pay' FROM 'lists'");
  2.  
  3. $lists = array(); //тут будет массив
  4.  
  5. while($list = mysql_fetch_assoc($result)) // в цикле формируем массив
  6. $lists[$list['pid']][] = $list;
  7.  
  8. //далее наша главная рекурсивная функция, которая сформирует дерево
  9. function create_tree($lists, $pid){
  10. if(is_array($lists) && isset($lists[$pid])){
  11. $tree = '<ul>';
  12. foreach($lists[$pid] as $list){
  13. $list['type_id'] = translit($list['name']);
  14. $tree .= '<li>';
  15. $tree .= "<input type=\"".$list['type']."\" id=\"".$list['type_id']."\">";
  16. $tree .= "<label for=\"".$list['type_id'].">".$list['name'].'</label>';
  17. $tree .= create_tree($lists, $list['id']);
  18. $tree .= '</li>';
  19. }
  20. $tree .= '</ul>';
  21. } else
  22. return null;
  23.  
  24. return $tree;
  25. }
  26.  
  27. // вызываем функцию и строим дерево
  28. echo create_tree($lists, 0);
Добавлено за 0.033 секунд, используя GeSHi 1.0.8.10

Изменил(а) Zaxap, 07.02.2015 23:40
Зло не дремлет, а я добрый...
 
Polarfox
Необычный код, ну похоже на то,
а в чем вопрос?
Всегда делайте backup перед изменениями | Указывайте свою версию в подписи/профиле. | Вся бесплатная тех. поддержка только на форуме

PolarLab - вход для подопытных
 
Web
Zaxap
PolarFox, как сделать вывод комментариев, минимально нагружая сервер...
Зло не дремлет, а я добрый...
 
Polarfox
Добавить кэш, выбирать постранично.

А вообще нужно вначале понять - где нагрузка.
Всегда делайте backup перед изменениями | Указывайте свою версию в подписи/профиле. | Вся бесплатная тех. поддержка только на форуме

PolarLab - вход для подопытных
x1
 
Web
Rush
че тут сложного, выбираешь все комменты, потом рекурсивной функцией строишь дерево. рекурсию можно реализовать 2мя способами, собственно с помощью самой рекурсии, т.е. последовательного вызова функции внутри себя, либо с помощью передачи данных по ссылке. второй метод сложней понять, но он проще в реализации.

пример

Загрузить источник  GeSHi: PHP
  1.  
  2. $arr = array(
  3. 1 => array(
  4. 'id' => 1,
  5. 'parent' => 0,
  6. 'title' => 'asdasd'
  7. ),
  8. 2 => array(
  9. 'id' => 2,
  10. 'parent' => 1,
  11. 'title' => 'asdasd'
  12. ),
  13. 3 => array(
  14. 'id' => 3,
  15. 'parent' => 2,
  16. 'title' => 'asdasd'
  17. ),
  18. 4 => array(
  19. 'id' => 4,
  20. 'parent' => 1,
  21. 'title' => 'asdasd'
  22. ),
  23. 5 => array(
  24. 'id' => 5,
  25. 'parent' => 4,
  26. 'title' => 'asdasd'
  27. ),
  28. 6 => array(
  29. 'id' => 6,
  30. 'parent' => 2,
  31. 'title' => 'asdasd'
  32. ),
  33. );
  34.  
  35. function build_tree_array($array) {
  36. $tree = array();
  37. if (!empty($array)) {
  38. foreach($array as $id => &$row){
  39. if($row['parent'] === 0) {
  40. $tree[$id] = &$row;
  41. } else {
  42. $array[$row['parent']]['children'][$id] = &$row;
  43. }
  44. }
  45. }
  46. return $tree;
  47. }
  48.  
  49. var_dump(build_tree_array($arr));
  50.  
Добавлено за 0.032 секунд, используя GeSHi 1.0.8.10


Загрузить источник  GeSHi: PHP
  1.  
  2. array(1) {
  3. [1]=>
  4. array(4) {
  5. ["id"]=>
  6. int(1)
  7. ["parent"]=>
  8. int(0)
  9. ["title"]=>
  10. string(6) "asdasd"
  11. ["children"]=>
  12. array(2) {
  13. [2]=>
  14. array(4) {
  15. ["id"]=>
  16. int(2)
  17. ["parent"]=>
  18. int(1)
  19. ["title"]=>
  20. string(6) "asdasd"
  21. ["children"]=>
  22. array(2) {
  23. [3]=>
  24. array(3) {
  25. ["id"]=>
  26. int(3)
  27. ["parent"]=>
  28. int(2)
  29. ["title"]=>
  30. string(6) "asdasd"
  31. }
  32. [6]=>
  33. array(3) {
  34. ["id"]=>
  35. int(6)
  36. ["parent"]=>
  37. int(2)
  38. ["title"]=>
  39. string(6) "asdasd"
  40. }
  41. }
  42. }
  43. [4]=>
  44. array(4) {
  45. ["id"]=>
  46. int(4)
  47. ["parent"]=>
  48. int(1)
  49. ["title"]=>
  50. string(6) "asdasd"
  51. ["children"]=>
  52. array(1) {
  53. [5]=>
  54. array(3) {
  55. ["id"]=>
  56. int(5)
  57. ["parent"]=>
  58. int(4)
  59. ["title"]=>
  60. string(6) "asdasd"
  61. }
  62. }
  63. }
  64. }
  65. }
  66. }
  67.  
Добавлено за 0.036 секунд, используя GeSHi 1.0.8.10

x1 x1 x1
 
Web

Поделиться этой темой
Социальные закладки: Vkontakte Odnoklassniki Mail.ru Facebook Google Tweet This
URL:
BBcode:
HTML:

Перейти на форум:
Похожие темы
Темы Форум Ответов / Просмотров Последние сообщения
Как перейти с http на https  →  Вопросы новичков 22 / 20686 09.08.2019 10:05
Перешел на HttpS - Как теперь удалить Http?!  →  Вопросы новичков 1 / 252 18.06.2019 13:19
как правильно сделать phpmailer на utf-8?  →  Ошибки, баги 5 / 369 09.06.2019 14:15
Как определить необходимые мощности хостинга для группы сайтов с определённой посещалкой?  →  Хостинг 0 / 681 20.02.2019 20:46
хочу сделать Выпадающее и др. меню  →  Народное творчество 11 / 8127 21.01.2019 15:32
Сделать ответыт на фриланс биржах на CURL - как?  →  PHP 1 / 634 05.11.2018 12:43
Выборка из базы не с начала, а с конца.  →  Вопросы новичков 3 / 1306 17.07.2018 08:11
Лендингоподобная главная - как заверстать адаптивно в CSS?  →  Пожелания и предложения 2 / 2100 24.04.2018 13:13
Как найти в БД для панели "похожие статьи, новости, темы"?  →  Пожелания и предложения 0 / 1143 23.04.2018 17:29
Как защититься от спамеров? капча есть, но она легко вводится  →  Моды 11 / 9030 26.02.2018 19:52
Топ 5 пользователей форума
Alex Alex (1,211)   Zaxap Zaxap (1,089)   Vova Vova (877)   Pisatel Pisatel (678)   util util (666)