|
|
|
| Всем доброй ночи! Использую для древовидных комментариев функцию от Игоря Вячеславовича:
<?
// Использование
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 вложенностей). Если возможно, то подскажите пожалуйста, как правильно это делается.. | |
|
|
|
|
|
|
|
для: ladan
(11.04.2012 в 01:57)
| | Без рекурсии нельзя. Сначала выбираешь все записи одним запросом, сортируя по parent_id. Затем рекурсивно строишь дерево(рекурсивная ф-ия не должна отправлять никаких запросов). | |
|
|
|
|
|
|
|
для: Красная_шляпа
(11.04.2012 в 10:18)
| | ясно спасибо | |
|
|
|
|
|
|
|
для: 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"]);
}
}
}
|
но и то это хреновая функция не совсем верная хотя и не критично | |
|
|
|
|
|
|
|
для: Красная_шляпа
(11.04.2012 в 14:35)
| | спасибо за пример :) Буду юзать тогда функцию от softtime | |
|
|
|