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) Загрузка поддерева, заданного списками смежности Вывод дерева Сортировка массива, в котором хранится дерево
