Tree/AlLoadAll

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

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

popoff

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

<?php
function tree_list_tree(&$a_list,$k_item=0)
{
  if(empty($a_list[$k_item])) return array();
  $a_tree=array();
  for($i=0;$i<count($a_list[$k_item]);$i++)
  {
    $a_tree[]=array(
      'k_item' => $a_list[$k_item][$i]['k_item'],
      's_name' => $a_list[$k_item][$i]['s_name'],
      'a_tree' => tree_list_tree($a_list,$a_list[$k_item][$i]['k_item'])
      );
  }
  return $a_tree;
}
 
function tree_list_load_all()
{
  // Возвращает ложь в случае ошибки
 
  //1. Загружаем данные. Загружаем в таком виде, в каком они записаны в таблице.
 
  //Загружаем сразу все дерево одним запросом
  $r=mysql_query("
    select
      t_catalog_tree.k_item,   #идентификатор элемента
      t_catalog_tree.k_parent, #идентификатор родительского элемента
                               #   элементы верхнего уровня содержат здесь 0
      t_catalog.s_name         #название
    from
      t_catalog,               #данные
      t_catalog_tree           #дерево
    where
      t_catalog.k_item=t_catalog_tree.k_item
    order by
      t_catalog.s_name");
  //Обратите внимание, что в запросе строки отсортированы по s_name.
  //Это сделано для того, что бы и сами элементы массива $a_tree и
  //  списки дочерних элементов этого массива были отсортированы по этому полю.
 
  if(!$r) return false;
 
  $a_list=array();
  //Ключ массива - идентификатор родительского элемента
  // значение - список дочерних элементов
 
  for($i=0;$i<mysql_num_rows($r);$i++)
  {
    $f=mysql_fetch_assoc($r);
    if(empty($a_list[$f['k_parent']]))
      $a_list[$f['k_parent']]=array();
    $a_list[$f['k_parent']][]=$f;
  }
 
  return tree_list_tree($a_list);
}
 
?>
Личные инструменты