Tree/NsLoadAll

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

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

popoff

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

<?php
function tree_ns_load_all()
{
  // Возвращает ложь в случае ошибки
 
  //Загружаем сразу все дерево одним запросом
  $r=mysql_query("
    select
      t_catalog_tree.k_item,   #идентификатор элемента
      t_catalog_tree.i_left,   #правое значение
      t_catalog_tree.i_right,  #левое значение
      t_catalog_tree.i_level,  #уровень
      t_catalog.s_name         #название
    from
      t_catalog,               #данные
      t_catalog_tree           #дерево
    where
      t_catalog.k_item=t_catalog_tree.k_item
    order by
      t_catalog_tree.i_left");
 
  //Обратите внимание, что в запросе строки отсортированы по i_left.
  //  ! Для нормальной следующей части функции строки нельзя сортировать по
  //    другому полю!
  //Если дерево должно быть отсортировано по другому полю - сортируйте тот
  //  массив, который возвращает эта функция.
 
  if(!$r) return false;
 
  $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;
}
 
?>

Небольшой анализ скорости загрузки дерева при помощи этой функции:

  • 1 000 вершин - 0.027 секунд
  • 10 000 вершин - 0.297 секунд

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

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