Tree/NsLoadPath

Материал из PhpWiki.

Перейти к: навигация, поиск
 Деревья в базах данных =>  Вложенные множества =>  Загрузка дерева =>  Загрузка пути
Как загрузить путь к заданной вершине?

popoff

Представленный здесь скрипт возвращает массив, описанный здесь: Внутреннее представление деревьев в программах

<?php
 
// Эта функция возвращает части sql-запроса, которые Вы можете использовать
//   при построении sql-запроса на выборку пути к вершине
function tree_ns_load_path_sql($s_table)
{ // $s_table - имя таблицы, содержащей дерево
  // В качестве результата возвращает массив, в котором содержатся элементы:
  //  from - часть из раздела FROM sql-запроса
  //  level_child - номер дочернего уровня
  //  level - номер родительского уровня
  //  parent - идентификатор родительского элемента
  //  child - идентификатор дочернего элемента
  //  where - часть из раздела WHERE sql-запроса
  return array(
    'from' =>
      $table." as mtp_1,
      ".$table." as mtp_2",
    'child' => 'mtp_1.k_item',
    'parent' => 'mtp_2.k_item',
    'level' => 'mtp_2.i_level',
    'level_child' => 'mtp_1.i_level',
    'where' => "
      mtp_2.i_left<=mtp_1.i_left and
      mtp_2.i_right>=mtp_1.i_right and
      mtp_2.i_level<=mtp_1.i_level
      "
    );
}
 
function tree_ns_load_path($k_item)
{
  // Возвращает ложь в случае ошибки
  if(empty($k_item)||!is_numeric($k_item)) return false;
 
  $sql=tree_ns_load_path_sql('t_catalog_tree');
 
  $r=mysql_query("
    select
      t_catalog.k_item,   #идентификатор элемента
      t_catalog.s_name    #название
    from
      ".$sql['from'].",       #дерево
      t_catalog               #данные
    where
      ".$sql['where']." and
      ".$sql['child']."=".$k_item." and
      t_catalog.k_item=".$sql['parent']."
    order by
      ".$sql['level']."");
  // Выборка может быть отсортировна по любому полю, в том числе и по полю s_name
 
  if(!$r) return false;
 
  $a_tree=array();
  $p=&$a_tree; //Указатель на текущий уровень
  //Если отсортировть выборку в обратном порядке, то можно обойтись без указателей
  //  Смотрите, как это сделано при загрузке пути в дереве, заданного
  //  списками смежности
  for($i=0;$i<mysql_num_rows($r);$i++)
  {
    $f=mysql_fetch_assoc($r);
    $p[]=array(
      'k_item' => $f['k_item'],
      's_name' => $f['s_name'],
      'a_tree' => array()
      );
    $p=&$p['a_tree'];
  }
 
  return $a_tree;
}
 
?>

Смотрите так же: Другие способы загрузки дерева, представленного вложенными множествами Загрузка пути к вершине для дерева, представленного списками смежности Вывод дерева

Личные инструменты