Tree/NsLoadSubtree

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

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

popoff

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

<?php
 
// Эта функция возвращает части sql-запроса, которые Вы можете использвоать
//   при построении sql-запроса на выборку поддерева
function tree_ns_load_subtree_sql($s_table)
{ // $s_table - имя таблицы, содержащей дерево
  // В качестве результата возвращает массив, в котором содержатся элементы:
  //  from - часть из раздела FROM sql-запроса
  //  level_child - номер дочернего уровня
  //  level_parent - номер родительского уровня
  //  parent - идентификатор родительского элемента
  //  child - идентификатор дочернего элемента
  //  order - порядок, в котором следует отсортировать выборку,
  //        что бы учитывать порядок, заданный структурой дерева
  //  where - часть из раздела WHERE sql-запроса
 
  //Эта функция отличается от функции tree_ns_load_level_sql только в условии where
  return array(
    'from' =>
      $table." as mtl_1,
      ".$table." as mtl_2",
    'level_child' => 'mtl_2.i_level',
    'level_parent' => 'mtl_1.i_level',
    'parent' => 'mtl_1.k_item',
    'child' => 'mtl_2.k_item',
    'order' => 'mtl_2.i_left',
    'where' => "mtl_2.i_left between mtl_1.i_left+1 and mtl_1.i_right-1"
    );
}
 
function tree_ns_load_subtree($k_parent)
{
  // Возвращает ложь в случае ошибки
  if(empty($k_parent)||!is_numeric($k_parent)) return false;
  $sql=tree_ns_load_subtree_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['parent']."=".$k_parent." and
      t_catalog.k_item=".$sql['child']."
    order by
      ".$sql['order']."");
  //  ! Для нормальной следующей части функции строки нельзя сортировать по
  //    другому полю!
  //Если дерево должно быть отсортировано по другому полю - сортируйте тот
  //  массив, который возвращает эта функция.
 
  if(!$r) return false;
 
  //Далее идет такой же текст, как и для функции загрузки всего дерева
  //  tree_ns_load_all
 
  $a_tree=array(); //Результат
  $a_path=array(&$a_tree); //Указатели на вершины - родители
  $i_level=0;
  for($i=0;$i<mysql_num_rows($r);$i++)
  {
    $f=mysql_fetch_assoc($r);
    if($f['i_level']>$i_level)
    {
      //Если мы попали на уровень ниже, чем были раньше, значит:
      // - номер предыдущего уровня ровно на 1 меньше текущего
      // - уже обработана хотя бы одна вершина на предыдущем уровне
      if($f['i_level']!=$i_level+1||!count($a_path[$i_level]))
        return false; //Такого быть не должно - ошибка в дереве
 
      $a_path[$f['i_level']]=&$a_path[$i_level][count($a_path[$i_level])-1]['a_tree'];
    }
    $a_path[$f['i_level']][]=array(
      'k_item' => $f['k_item'],
      's_name' => $f['s_name'],
      'a_tree' => array()
      );
    $i_level=$f['i_level'];
  }
  return $a_tree;
}
 
?>

Смотрите так же: Загрузка одного уровня для дерева, заданного вложенными множествами (функция tree_ns_load_level_sql) Загрузка всего дерева, заданного вложенными множествами (функция tree_ns_load_all) Загрузка поддерева, заданного списками смежности Вывод дерева Сортировка массива, в котором хранится дерево

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