Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Как указать с какого id начинать отображение в ветке
Форумы портала PHP.SU » » Вопросы новичков » Как указать с какого id начинать отображение в ветке

Страниц (1): [1]
 

1. livote - 14 Сентября, 2014 - 17:42:55 - перейти к сообщению
Есть код, который выводит комменты. для примера сократил его.

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

PHP:
скопировать код в буфер обмена
  1. $result = mysql_query("SELECT id, parent_id FROM comments");
  2.  
  3.  
  4. while($row = mysql_fetch_assoc($result)){
  5.   $comment[] = $row;
  6. }
  7.  
  8. $count = count($comment);
  9.  
  10. $i = 0;
  11.   $comment = commsort($comment);
  12.   while($i<$count){
  13.  
  14.  
  15.     $margin = $comment[$i]['level'] * 35;
  16.        
  17.  
  18.     $comments .= "<div style='margin-left: {$margin}px'>{$comment[$i]['id']}</div>";
  19.     $i++;
  20.   }
  21. echo $comments;
  22.  
  23. function commsort(&$comments, $parentComment = 0, $level = 0, $count = null){
  24.  
  25.     if (is_null($count)){
  26.       $c = count($comments);
  27.     }else{
  28.       $c = $count;
  29.     }
  30.     for($i=0;$i<$c;$i++){
  31.       if (!isset($comments[$i])) continue;
  32.       $comment = $comments[$i];
  33.       $parentId = $comment['parent_id'];
  34.       if ($parentId == $parentComment){
  35.         $comment['level'] = $level;
  36.         $commentId = $comment['id'];
  37.         $return[] = $comment;
  38.         unset($comments[$i]);
  39.         while ($nextReturn = commsort($comments, $commentId, $level+1, $c)){
  40.           $return = array_merge($return, $nextReturn);
  41.         }
  42.       }
  43.     }
  44.     return $return;
  45.  
  46. }
2. kotyara1979 - 15 Сентября, 2014 - 04:32:43 - перейти к сообщению
Измените подход.

Вам же известна связь комментариев с объектом комментирования?

Соответственно, делаете выборку по данному объекту комментариев верхнего уровня:

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT id FROM comments WHERE `объект комментирования` = [нужный] AND parent_id IS NULL ORDER BY date_create


Далее цикл по выборке. При получении id верхней записи запускаем функцию получения по нему следующего уровня. Функцию делаем рекурсивной.

Нечто вроде.

PHP:
скопировать код в буфер обмена
  1.  
  2. function next_level($parent_id)
  3. {
  4.     $query = "select id, parent_id from comments where `объект комментирования` = [нужный] and parent_id = {$parent_id} by date_create";
  5.  
  6.    while()
  7.    {
  8.        print // выводится текущая запись
  9.        next_level($row['parent_id']);
  10.    }
  11.  
  12. }
  13.  


Собственно и все. Вчерне задача так решается.

 

Powered by ExBB FM 1.0 RC1