Категории бесконечной вложенности

Очередная задача — сделать категории бесконечной вложенности средствами 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&#91;'lvl'&#93;; $i++)
					{
						$lvl_see .= '-';
					}
				   
					$out .= '<option value="'.$rows&#91;'id'&#93;.'">'.$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&#91;'id'&#93;.'">'.$rows['category'].'</a></li>';
		foo($rows['id']);
	}
	$out .= '</ul>';
	return $out;
}

echo foo(0);
?>

Тут нам lvl уже не нужен, поэтому кода меньше. А ниже результат

Если у вас есть более красивые решения, то ждем в комментариях. Лучшие я добавлю прям в статью. 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Scroll Up