Очередная задача — сделать категории бесконечной вложенности средствами PHP. Облазив несколько сайтов я нашел много решений, но вот они не все доступны для моего понимания, т.к. уровень программирования там выше моего. Поэтому я нашел самое простое, возможно, не самое элегантное, но зато рабочее решение.
Сначала давайте посмотрим, что у меня находится в БД
Структура БД
- id — идентификатор нашей категории
- category — название категории
- category_id — идентификатор родительской категории. Можно было назвать parent_id, но так мне привычнее
- lvl — уровень вложенности категории. Нужен для формирования <option>...</option>
- Все, что замазано — вам ни к чему, т.к. там информация нужная для меня лично, и чтобы вас не вводит в заблуждение — я затер эту ненужную инфу.
Вывод категорий в <select><option>
<? echo ' <select name="category_id" >'; echo '<option>-</option>'; $out; function foo($category_id){ global $out; $res = mysql_query("SELECT * FROM category WHERE category_id = $category_id"); while($rows = mysql_fetch_assoc($res)){ for($i=0; $i<$rows['lvl']; $i++) { $lvl_see .= '-'; } $out .= '<option value="'.$rows['id'].'">'.$lvl_see.''.$rows['category'].'</option>'; foo($rows['id']); } $lvl_see = ''; return $out; } echo foo(0); echo ' </select>'; ?>
Особо тут рассказывать нечего, если есть вопросы, то пишите в комментарии, а тем кому особо все равно, что здесь написано, предлагаю сразу посмотреть результат
Вывод категорий в форму
Если вы не поняли, то поле lvl в базе данных нам как раз нужно для того, чтобы знать, сколько "-" ставить перед названием категорий. Конечно, есть более изысканный метод без lvl, но на данный момент у меня только такое решение. Как что изменится — обновлю статью.
Вывод категорий в <ul><li>
А вот вам другое решение, когда нужно вывести не в форму, а в список.
<? $out; function foo($category_id){ global $out; $res = mysql_query("SELECT * FROM category WHERE category_id = $category_id"); $out .= '<ul>'; while($rows = mysql_fetch_assoc($res)){ $out .= '<li><a href="?id='.$rows['id'].'">'.$rows['category'].'</a></li>'; foo($rows['id']); } $out .= '</ul>'; return $out; } echo foo(0); ?>
Тут нам lvl уже не нужен, поэтому кода меньше. А ниже результат
Если у вас есть более красивые решения, то ждем в комментариях. Лучшие я добавлю прям в статью.