Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: как правильно собрать свой велосипед
 
 автор: ladan   (11.04.2012 в 01:57)   письмо автору
 
 

Всем доброй ночи! Использую для древовидных комментариев функцию от Игоря Вячеславовича:

<?

   
// Использование 
  
echo tree_comment(0); 
  
// Реализация 
  
function tree_comment($id 0$intent 0)  
  {  
    
$id intval($id);  

    
$comment mysql_query("SELECT * FROM comments WHERE id_parent = ".$id." ORDER BY id ASC");  
   
      while(
$comment_row mysql_fetch_array($comment))  
      {  
        
// Вывод комментария 
        
echo "<p style='margin-left: {$intent}px'>".$comment_row['message']."</p>";  
        
// Рекурсивный вызов 
        
tree_comment($comment_row['id'], $intent 50);  
      }  
    
  }

?>


Работает хорошо, но я так и не понял по какому принципу она работает(вообще рекурсии напрягают). Сделать нечто подобное с помощью нерекурсии:


<?
//Реализация
$main_comment mysql_query("SELECT * FROM comments WHERE id_parent='0'");
$main_comment_row mysql_fetch_assoc($main_comment);

    
$one_parent mysql_query("SELECT * FROM comments WHERE id_parent='".$main_comment_row['id']."' ORDER BY id ASC"); 
    while(
$one_parent_row mysql_fetch_assoc($one_parent)) 
    {
        
$arr1[] = $one_parent_row['id'];
        
$arr2[] = 1;
        
$two_parent mysql_query("SELECT * FROM comments WHERE id_parent='".$one_parent_row['id']."' ORDER BY id ASC");
        while(
$two_parent_row mysql_fetch_assoc($two_parent))
            {
                
$arr1[] = $two_parent_row['id'];
                
$arr2[] = 2;
                    
$thee_parent mysql_query("SELECT * FROM comments WHERE id_parent='".$two_parent_row['id']."' ORDER BY id ASC");
                    while(
$thee_parent_row mysql_fetch_assoc($thee_parent))
                    {
                    
$arr1[] = $thee_parent_row['id'];
                    
$arr2[] = 3;
                        
$four_parent mysql_query("SELECT * FROM comments WHERE id_parent='".$thee_parent_row['id']."' ORDER BY id ASC");
                        while(
$four_parent_row mysql_fetch_assoc($four_parent))
                        {
                        
$arr1[] = $four_parent_row['id'];
                        
$arr2[] = 4;
                        
                            
$five_parent mysql_query("SELECT * FROM comments WHERE id_parent='".$four_parent_row['id']."' ORDER BY id ASC");
                            while(
$five_parent_row mysql_fetch_assoc($five_parent))
                            {
                            
$arr1[] = $five_parent_row['id'];
                            
$arr2[] = 5;
                            }
                        }
                    }
            }
            
    }    
array_unshift($arr1,$main_comment_row['id']);
array_unshift($arr2,0);    


//Использование    
for($i=0;$i++<count($arr1);) {
    
$comment mysql_query("SELECT * FROM comments WHERE id='".$arr1[$i-1]."'");
    
$comment_row mysql_fetch_assoc($comment);
    
$style "style='margin-left:".($arr2[$i-1] * 50)."px;'";
    echo 
"<p ".$style.">".$comment_row['message']."</p>";
    
    }

?>


Сейчас стоит вопрос- возможно ли сделать нерекурсией бесконечное дерево?(в моем скрипте максимум сделал до 5 вложенностей). Если возможно, то подскажите пожалуйста, как правильно это делается..

  Ответить  
 
 автор: Красная_шляпа   (11.04.2012 в 10:18)   письмо автору
 
   для: ladan   (11.04.2012 в 01:57)
 

Без рекурсии нельзя. Сначала выбираешь все записи одним запросом, сортируя по parent_id. Затем рекурсивно строишь дерево(рекурсивная ф-ия не должна отправлять никаких запросов).

  Ответить  
 
 автор: ladan   (11.04.2012 в 11:51)   письмо автору
 
   для: Красная_шляпа   (11.04.2012 в 10:18)
 

ясно спасибо

  Ответить  
 
 автор: Красная_шляпа   (11.04.2012 в 14:35)   письмо автору
 
   для: ladan   (11.04.2012 в 11:51)
 

Типа такого


<?php

function print_video_comments_tree($router$id$comments$pid 0) {
    foreach (
$comments as $arr) {
        if (
$arr["pid"] == $pid) {
            echo(
"<div class=\"comment-container\" style=\"padding-left: " . ($arr["depth"] < 10 $arr["depth"] * 20 200) . "px\">
<a name=\"comment
{$arr["id"]}\"></a><div class=\"comment-wrapper\"><div class=\"comment-info\">");           
            echo(
"<img src=\"http://www.gravatar.com/avatar/" md5(strtolower($arr["email"])) . "?size=48\" alt=\"Gravatar\" class=\"gravatar\" />От: {$arr["author"]}<br />Дата/время: " date("d.m.Y/H:i:s"$arr["time"])); 
            if (
is_admin()) {
                echo(
"<br />IP-адрес: {$arr["ip"]}");
            }
            
            
$comment prepare_comment($arr["comment"]);
            if (
$arr["deleted"]) {
                
$comment is_admin() ? "<s>$comment</s>" "<em>Комментарий скрыт(виден только администрации).</em>";
            }
            
            echo(
"</div><p class=\"comment\">{$comment}</p>"); 
            if (
$arr["editor"]) {
                echo(
"Редактировано: " num_end($arr["edit_counter"], "раз", array("""а""")) . ". Последний раз - {$arr["editor"]} от " date("d.m.Y H:i:s"$arr["edit_time"]) . ".<br />");
            }
            

            echo(
ref($router->forUrl("page_video_addcomment", array($id)) . "?response_to={$arr["id"]}""Ответить"));
            
            if (
is_admin() || is_my_comment($arr["id"])) {
                echo(
" | " ref($router->forUrl("page_video_editcomment", array($arr["id"])), "Редактировать"));
            }  
            if (
is_admin()) {
                if (
$arr["deleted"]) {
                    echo(
" | " ref($router->forUrl("page_video_restorecomment", array($arr["id"])), "Восстановить"));
                }
                else {
                    echo(
" | " ref($router->forUrl("page_video_deletecomment", array($arr["id"])), "Удалить"));
                }
            }
            
            if (
$arr["pid"]) {
                echo(
" | <a href=\"#comment{$arr["pid"]}\">Выше</a>");
            }
            
// echo(" | <a href=\"#comment{$arr["id"]}\">Ссылка</a>");
            
echo("</div></div>");
            
print_video_comments_tree($router$id$comments$arr["id"]);
        }
    }
}



но и то это хреновая функция не совсем верная хотя и не критично

  Ответить  
 
 автор: ladan   (11.04.2012 в 20:12)   письмо автору
 
   для: Красная_шляпа   (11.04.2012 в 14:35)
 

спасибо за пример :) Буду юзать тогда функцию от softtime

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования