Древовидная структура комментариев

Дата публикации: Июнь 23, 2010 - 13:51:16, ср

Надо было быстро сделать вывод древовидной структуры комментариев. Нашел ранее написанный мною зверский код, который все же работал как надо.

Ниже представлена структура таблицы комментариев. В ней должно быть все понятно. Рассказывать как работает добавление комментариев – не буду.

  1. CREATE TABLE IF NOT EXISTS `company_comments` (
  2.   `id` int(11) NOT NULL auto_increment,
  3.   `user_id` int(11) NOT NULL,
  4.   `company_id` int(11) NOT NULL,
  5.   `username` varchar(100) NOT NULL,
  6.   `comment` text NOT NULL,
  7.   `parent_id` int(11) NOT NULL default '0',
  8.   PRIMARY KEY  (`id`),
  9.   KEY user_id (user_id,company_id),
  10.   KEY parent_id (`parent_id`)
  11. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

И вот сама функция, которая на вход принимает массив комментариев в любом порядке и сортирует их по parent_id и level. Результат можно будет вывести на страницу простым foreach-ем.

  1. function crazySorting(&$comments, $parentComment = 0, $level = 0, $count = null)
  2. {
  3.     if (is_array($comments) && count($comments))
  4.     {
  5.         $return = array();
  6.         // хитрозакрученно обрабатываем
  7.         // передаем всегда изначальное количество комментов
  8.         if (is_null($count))
  9.         {
  10.             $c = count($comments);
  11.         }
  12.         else
  13.         {
  14.             $c = $count;
  15.         }
  16.         for($i=0;$i<$c;$i++)
  17.         {
  18.             if (!isset($comments[$i])) continue;
  19.             $comment = $comments[$i];
  20.             $parentId = $comment['parent_id'];
  21.             if ($parentId == $parentComment)
  22.             {
  23.                 $comment['level'] = $level;
  24.                 $commentId = $comment['id'];
  25.                 $return[] = $comment;
  26.                 unset($comments[$i]);
  27.                 while ($nextReturn = crazySorting($comments, $commentId, $level+1, $c))
  28.                 {
  29.                     $return = array_merge($return, $nextReturn);
  30.                 }
  31.             }
  32.         }
  33.         return $return;
  34.     }
  35.     return false;
  36. }

Рекурсивный метод может быть и не так хорош, как nested sets, но все же он работает.

Кстати, от параметра level вполне можно отказаться, если создать в таблице одноименное поле и хранить в нем уровень вложенности комментария.

Теги: кодинг php
Просмотров: 853

Комментарии

Deed
Январь 10, 2011 - 01:20:47, пн
Скажу, что мастера очень неохотно делятся секретами "деревьев". Мне, например, пришлось самому изобретать лайбу. Но колеса не совсем круглые получилсь..

Что скажете?

Имя:
Код Код с картинки: