<MyRusakov.ru />

Профессия Web-разработчик

Профессия Web-разработчик

Этот комплект за 8 месяцев превратит Вас в Web-разработчика с нуля. Учиться достаточно 1 час в день.

Начнёте Вы с HTML, CSS и вёрстки сайтов. Потом перейдёте к программированию и JavaScript. Затем изучите PHP, MySQL, SQL, Python. Изучите Web-фреймворки Laravel и Django. Создадите 5 своих сайтов для портфолио.

Комплект содержит:

- 540 видеоуроков

- 110 часов видео

- 1205 заданий для закрепления материала из уроков

- 5 финальных тестов

- 7 сертификатов

- 12 Бонусных курсов

Подробнее
Подписка

Подпишитесь на мой канал на YouTube, где я регулярно публикую новые видео.

YouTube Подписаться

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Какая тема Вас интересует больше?

Древовидные структуры данных в PHP на примере вложенных комментариев

Древовидные структуры данных в PHP на примере вложенных комментариев

Одной из самых распространенных структур данных в программировании является - дерево. Например, дерево комментариев, дерево каталогов, дерево категорий и т.д. Т.е. это абстракция окружает нас везде.

Далее я покажу вам пример, как можно создать древовидную структуру данных в PHP с помощью рекурсивной функции. Данная функция будет создавать структуру с произвольной вложенностью дочерних элементов.

Код ниже может быть использован для вывода древовидных комментариев к статье:


<?php

     //  строит структуру дерево из простого списка
    function buildTree(array &$list)
    {
        $tree = [];

        // делаем группировку по идентификатору родителя
        foreach ($list as $node) {
            $tree[$node['parent_id']][] = $node;
        }

        // рекурсивная функция, создающая вложенную (древовидную) структуру
        $recursiveBuilder = function ($children) use (&$recursiveBuilder, $tree) {

            foreach ($children as $key => $child)
            {
                $child_id = $child['comment_id'];

                if (isset($tree[$child_id])) {
                    $child['answers'] = $recursiveBuilder($tree[$child_id]);
                }

                $children[$key] = $child;
            }

            return $children;
        };

        return $recursiveBuilder($tree[0]);
    }


Вот структура таблицы комментариев:


create table comments
(
    comment_id int auto_increment                     primary key, -- первичный ключ - id комментария
    post_id    int                                    null,        -- id статьи
    parent_id  int          default 0                 null,        -- идентификатор родительского комментария
    author     varchar(100) default 'Нет имени'       null,
    created_at datetime     default CURRENT_TIMESTAMP null,
    text       text                                   null
)
comment 'хранит все комментарии к статьям'

Создание вложенных комментариев:


<?php

    // функция для работы  с подключения к базе MySQL
    function connection(string $host, string $db, string $user, string $pass, string $charset = 'utf8'): \PDO
    {
        $dsn = "mysql:host=$host;dbname=$db;charset=$charset";
        $opt = [
            PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            PDO::ATTR_EMULATE_PREPARES   => false,
        ];

        $pdo = new PDO($dsn, $user, $pass, $opt);

        return $pdo;
    }


    // подключаемся к базе
    $connection = connection('127.0.0.1', 'comments_db', 'user', 'password');

    // выбираем все комментарии к статье с идентификатором 1
    $stmt = $connection->query('SELECT * FROM comments WHERE post_id = 1');
    $comments = $stmt->fetchAll();

    // строим дерево
    $tree = buildTree($comments);

    // выводим на печать
    print_r($tree);

Вот таким образом можно создать дерево комментариев на PHP. Да и не только это. Например, с помощью функции buildTree(array) можно построить и каталог интернет-магазина и карту сайта.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (1):

alex alex alex alex 30.08.2023 11:40:26

Добрый день Михаил. скрипт работает, только выводил ошибку в том случае если нет комментариев на странице, я прописал условие и вложил в него рекурсивную функцию.. сейчас не могу сообразить как выводить сами комментарии - после запроса к базе у меня есть массив res, который переходит в tree, а как вывести сами файлы шаблонов комментов не пойму..у меня шаблон комментария и ответа сделаны разными файлами, которые из массива res успешно подключаются в форыче правда без рекурсии все в куче

Ответить

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.