Древовидные структуры данных в 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) можно построить и каталог интернет-магазина и карту сайта.
-
- Михаил Русаков
Комментарии (1):
Добрый день Михаил. скрипт работает, только выводил ошибку в том случае если нет комментариев на странице, я прописал условие и вложил в него рекурсивную функцию.. сейчас не могу сообразить как выводить сами комментарии - после запроса к базе у меня есть массив res, который переходит в tree, а как вывести сами файлы шаблонов комментов не пойму..у меня шаблон комментария и ответа сделаны разными файлами, которые из массива res успешно подключаются в форыче правда без рекурсии все в куче
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.