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