Для того чтобы вывести многоуровневые данные, без ограничения по уровню вложенности необходимо использовать рекурсию.
Рекурсия — это обращение функции к самой себе, другими словами вызов функции внутри кода функции самой себя.
Теперь поговорим о том, по какому принципу мы будем выводить многоуровневое меню. Данная задача (как и любая в программировании) имеет несколько решений. К примеру, одно из таких решений состоит в том, чтобы создать функцию (принимающая параметром идентификатор родительской категории), которая в своем коде формировала 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