Вывод многоуровневых комментариев или списков из БД

Для того чтобы вывести многоуровневые данные, без ограничения по уровню вложенности необходимо использовать рекурсию. Рекурсия — это обращение функции к самой себе, другими словами вызов функции внутри кода функции самой себя. Теперь поговорим о том, по какому принципу мы будем выводить многоуровневое меню. Данная задача (как и любая в программировании) имеет несколько решений. К примеру, одно из таких решений состоит в том, чтобы создать функцию (принимающая параметром идентификатор родительской категории), которая в своем коде формировала SQL запрос по выборке данных меню, по полю parent_id. То есть, при первом вызове функции, выбираются все записи, у которых поле parent_id = 0, затем parent_id = 1, далее parent_id = 2 и т.д. Далее в цикле вытягиваем данные из результата отработки SQL запроса и в этом же цикле вызываем данную функцию (рекурсивно саму на себя) и передаем ей идентификатор родительской категории, полученный у записи, вытащенной на данной итерации цикла. То есть на первой итерации мы с Вами вытаскиваем в переменную ассоциативный массив, в этом массиве есть ячейка с ключом parent_id, вот ее значение и передаем при вызове функции. Данный метод, казалось бы, очень неплохой, во-первых, он отлично работает, а во-вторых, имеет очень красивую и краткую реализацию. Но есть существенный недостаток – происходит многократное обращение к базе данных и выполнение запросов по выборке данных. А это не очень хорошо. Поэтому, мы пойдем по другому пути и решим поставленную задачу иначе. Итак, первым делом мы обратимся к базе данных и вытащим все категории, которые в ней содержатся. Далее из этих категорий сформируем массив, определенного вида. И только потом создадим функцию, которая будет обрабатывать данный массив и выводить категории на экран.

  function getComments()
  {
    $result   = $this->m->query("select * from `comments`");
    $arr_comm = array();
    if($result)
    {

      //В цикле формируем массив
      for($i = 0; $i < count($result);$i++)
      {
        $row = $result[$i];

        //Формируем массив где ключами являются адишники на родительские категории
        if(empty($arr_comm[$row['parent']]))
        {
          $arr_comm[$row['parent']] = array();
        }
        $arr_comm[$row['parent']][] = $row;
      }
      //возвращаем массив
      return $arr_comm;
    }
  }


  function viewComments($arr,$parent_id = 0)
  {
    //Условия выхода из рекурсии
    if(empty($arr[$parent_id]))
    {
      return;
    }
    
    $str = '<ul>';
    //перебираем в цикле массив и выводим на экран
    for($i = 0; $i < count($arr[$parent_id]);$i++)
    {
      $str .= '<li><a class="nick">'.$arr[$parent_id][$i]['name'].'</a><br/>'.$arr[$parent_id][$i]['comment'];
      //рекурсия - проверяем нет ли дочерних категорий
      $str .= $this->viewComments($arr,$arr[$parent_id][$i]['id']);
      $str .= '</li>';
    }
    $str .= '</ul>';
    return $str;
  }

Эти функции находятся в главном контроллере. И выводим полученную строку с отформатированными комментариями в файле вида main.php
That`s all falks
multilevel_comments.rar

09.03.2023

131
A B i U S JS

PHP HTML CSS
Чат
    Для входа только имэйл или имя и апроль
    Можно сменить аватар
    Имэйл Ваше имя
    Пароль