Первые шаги: Готовое решение рекурсии категорий

Одна из наиболее часто встречающихся задач по рекурсии — рекурсия дерева категорий

подготовка массива данных

<!--?php
	$categories = DB::query('SELECT id_parent, id, title, ... FROM categories', 'mlist');
	0 => array (
	  array('id' => 1, title' => 'title1', ...)
	  array('id' => 3, 'title' => 'title3', ...)
	),
	1 => array (
	  array ('id' => 2, 'title' => 'title2 is sub of title1', ...),
	  ...
	  array ('id' => 999, 'title' => 'title999 is sub of title1', ...)
	),
	id_parent => array (
	  array ('id' => id_of_sub, 'title' => 'title of sub', ...)
	)

вывод первого слоя

<!--?php
	foreach($categories[0] AS $root_category) {
	  echo '<h2>' . $root_category['title'] . '</h2>';
	}

добавление к первому слою второго

<!--?php
	foreach($categories[0] AS $root_category) {
	  echo '<h2>' . $root_category['title'] . '</h2>';
	  if (isset($categories[$root_category['id']])) {
		 ... и тут нам опять форич писать такой же как сверху - но мы не любим дублей кода поэтому) ... 
	  }
	}

сворачивание слоев функции в рекурсию

<!--?php
showCategories($categories, $root_id = 0) 
{
	foreach($categories[$root_id] AS $root_category) {
	  echo '<h2>' . $root_category['title'] . '</h2>';
	  if (isset($categories[$root_category['id']])) {
		 showCategories($categories, $root_category['id']);
	  }
	}
}

украшение может быть самое невероятное от верстки

<!--?php
showCategories($categories, $root_id = 0, $level = 0) 
{
     if ($level > 1) echo '<ul>';
	foreach($categories[$root_id] AS $root_category) {
	  if ($level == 0) {
		echo '<h2>' . $root_category['title'] . '</h2>';
	  } elseif ($level == 1) {
		echo '<h3>' . $root_category['title'] . '</h3>';  
	  } elseif ($level < 5) {
		echo '<li>' . $root_category['title'] . '</li>';
	  } else {
		echo '<li>' . str_repeat('>>', $level) . $root_category['title'] . '</li>';
	  }
	  if (isset($categories[$root_category['id']])) {
		 showCategories($categories, $root_category['id'], $level + 1);
	  }
	}
	if ($level > 1) echo '</ul>;
}

Оставить комментарий

XHTML: Вы можете использовать такие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">