делаю выборку по parent_id, через форич выводятся комменты родители, а вот детей родителей уже долго не ммогу разобраться как вывести..дерево по задумке должно состоять из двух уровней - главные комменты и под ними в ряд все остальные... PHP: Array ( [0] => Array ( [comment_id] => 109 [text_comm] => я тоже видел в новостях вчера [post_id] => 251 [user_id] => 90 [parent_id] => 77 [answer_id] => [username] => mike ) [1] => Array ( [comment_id] => 87 [text_comm] => у всех по разному - у кого то по новенькому, у других по старенькому, у кого как.. [post_id] => 251 [user_id] => 109 [parent_id] => 0 [answer_id] => [username] => henk moody ) [2] => Array ( [comment_id] => 86 [text_comm] => в новостях видел ага жесть.. [post_id] => 251 [user_id] => 109 [parent_id] => 77 [answer_id] => [username] => henk moody ) [3] => Array ( [comment_id] => 77 [text_comm] => да вон пожар на гаваях не слабый. [post_id] => 251 [user_id] => 102 [parent_id] => 0 [answer_id] => [username] => ivan777 ) ) вывод главных комментов делаю так, а с вложенным форичем чет не могу понять как что там сделать..буду благодарен специалистам если кто то подскажет как решить эту задачу и возможно ли без рекурсии. PHP: foreach($comments as $val){ if ($val['parent_id'] == 0){ $row = $val; require __DIR__ . '/../tpl/comment.php'; } }
переменная row приравнена к val, потому что в шаблонах комментов row..иначе аватарки слетают...скрипт аватаров привязан жестко к user_row..это потом я переделаю..
Продемонстрируйте на примере оригинального массива(используйте var_export()), и что из него должно получиться
у меня то выходила ошибка смещения строки при выводе ответов на комменты, то зацикливалось до зависания. в общем я не понял как использовать чисто parentid и id, добавил пока в таблицу левел - куда записывается тот же parentid, только ответы на ответы будут уже по левелу подцеплятся..сейчас немного продвинулся выводятся ответы, но как попало... вот эти ответы должны были ко второму комменту подцепится..странно
это я понял, я и хотел сделать это одной функцией, но пришлось делать двумя - один форыч для выбора главных комментов, а второй я сделал в шаблоне самого коммента для вывода ответов..вроде заработало..но проблема я думаю в том что там кнопка раскрытия ответов срабатывает где не должна..сейчас надо как то проверять - если нет ответов на данный коммент чтоб кнопка тоже не показывалась..понимаю как это сделать, но не конкретно...забыл как то проверять можно есть в массиве ответы или нет..много гуглил каша в голове) --- Добавлено --- выводится нормально как надо, а глючит из-за кнопки..
Судя по скрину, у вас задумана неограниченная вложенность комментов. То есть, рано или поздно, скорее рано, в целях снижения затрат, вы придете к тому, что сгенерированное дерево нужно как-то кэшировать. Так, может, лучше сразу для топиков составлять "карту"? В xml или json
выводится нормально как надо, а глючит из-за кнопки.. два уровня сделано вроде..но надо сделать кэш наверно тоже погуглить)
Код (Text): //Для вывода комментариев родителей и дочерних на основе значения parent_id можно использовать цикл и условие. Вот пример кода на PHP: function displayComments($comments, $parent_id = 0, $level = 0) { foreach ($comments as $comment) { if ($comment['parent_id'] == $parent_id) { echo str_repeat("-", $level) . $comment['text_comm'] . "<br>"; displayComments($comments, $comment['comment_id'], $level + 1); } } } // Пример использования $comments = [ [ "comment_id" => 109, "text_comm" => "я тоже видел в новостях вчера", "post_id" => 251, "user_id" => 90, "parent_id" => 77, "answer_id" => "", "username" => "mike" ], [ "comment_id" => 87, "text_comm" => "у всех по разному - у кого то по новенькому, у других по старенькому, у кого как..", "post_id" => 251, "user_id" => 109, "parent_id" => 0, "answer_id" => "", "username" => "henk moody" ], [ "comment_id" => 86, "text_comm" => "в новостях видел ага жесть..", "post_id" => 251, "user_id" => 109, "parent_id" => 77, "answer_id" => "", "username" => "henk moody" ], [ "comment_id" => 77, "text_comm" => "да вон пожар на гаваях не слабый.", "post_id" => 251, "user_id" => 102, "parent_id" => 0, "answer_id" => "", "username" => "ivan777" ], ]; displayComments($comments); Результат выполнения кода будет выглядеть следующим образом: -у всех по разному - у кого то по новенькому, у других по старенькому, у кого как.. --я тоже видел в новостях вчера -да вон пожар на гаваях не слабый. --в новостях видел ага жесть.. Символ "-" в начале каждого комментария указывает на его уровень (глубину вложенности). Комментарии, у которых значение parent_id равно 0, считаются корневыми комментариями. Комментарии с parent_id равным ID других комментариев считаются дочерними комментариями для соответствующих родителей.
но это вроде рекурсии получается с неограниченными уровнями? если я правильно понял. я сделал двумя форычами два уровня. форычи не вложенные, один тот что выше выводит родительские комменты из массива, который взят из базы, а второй форыч так же из этого массива по условию выводит потомков..так то работает все вроде нормально, не знаю как будет при большом количестве пользователей конечно. а как попало у меня отображалось это из-за кнопки "показать ответы"..я сейчас отключил всю эту логику js и комменты нормально выводятся. сейчас думаю как сделать чтоб кнопка отображалась и показывала сколько ответов на комменты и если их нет, то и кнопка бы не выводилась..и кроме как делать еще один цикл с условием, на ум ничего не идет. и вот вопрос - можно ли столько циклов напихивать на страницу? это же каждый коммент будет с таким счетчиком..комментов конечно думаю штук по 50 выводить в будущем. за помощь спасибо!
Да, этот код может работать с любой вложенностью комментариев. В функции displayComments происходит рекурсивный вызов функции самой себя для отображения подкомментариев. Это позволяет обрабатывать любую глубину вложенности. --- Добавлено --- Без использования рекурсии вы можете воспользоваться стеком для обхода всех комментариев вложенности. Вот пример решения с использованием стека: PHP: function displayComments($comments) { $stack = []; // добавляем корневые комментарии в стек foreach ($comments as $comment) { if ($comment['parent_id'] == 0) { $stack[] = [$comment, 0]; } } while (!empty($stack)) { list($comment, $level) = array_pop($stack); echo str_repeat("-", $level) . $comment['text_comm'] . "<br>"; // добавляем подкомментарии текущего комментария в стек foreach ($comments as $subcomment) { if ($subcomment['parent_id'] == $comment['comment_id']) { $stack[] = [$subcomment, $level + 1]; } } } } // Пример использования $comments = [ // ... ]; displayComments($comments); В этом решении мы используем стек для хранения комментариев и их уровня вложенности. Сначала добавляем в стек корневые комментарии (те, у которых parent_id равен 0). Затем в цикле извлекаем комментарий из стека, отображаем его и добавляем в стек все его подкомментарии с увеличенным уровнем вложенности. Процесс повторяется, пока стек не станет пустым.
а куда здесь подставлять фалы шаблона комментов и ответов, у меня отдельные шаблоны сделаны, вывод изначально был расчитан не через таблицу...переделывать не хотелось бы.
Было бы хорошо, если Вы сделаете более конкретное описание задачи или же оформите прототип кода на Github например. Сложно представить в полном объеме, что у Вас там.