class Tree (Дерево)
Class Tree (Дерево) – класс для работы с древовидными структурами, оптимизирован под высокую производительность, работу с большим количеством вложенных узлов, без труда способен обработать дерево с 25000 — 30000 элементами менее чем за 1 секунду.
<?php
class Tree
{
/** * Установить порядок сортировки элемента по id * @param mixed $id — идентификатор элемента * @param integer $order — порядок сортировки */public function setItemOrder($id , $order)
/** * Отсортировать дочерние элементы * @param mixed $parentId — необязательное, идентификатор родителя, по * умолчанию корневой узел, сортирует все узлы */public function sortItems($parentId = false)
/** * Проверить существует ли узел по его идентификатору * @param mixed $id * @return boolean */public function itemExists($id)
/** * Получить количество элементов в дереве * @return integer */public function getItemsCount()
/** * Добавить узел в дерево * @param mixed $id — уникальный идентификатор * @param mixed $parent — идентификатор родительского узла * @param mixed $data — данные узла * @param integer $order - порядок сортировки, необязательное * @return boolean — успешность выполнения */public function addItem($id , $parent , $data , $order = false)
/** * Обновить данные узла * @param mixed $id — идентификатор узла * @param mixed $data — данные узла * @return boolean — успешность выполнения */public function updateItem($id , $data)
/** * Получить структуру узла по его идентификатору * @param mixed $id * @return array массив с ключами ('id','parent','order','data') */public function getItem($id)
/** * Получить данные узла по его идентификатору * @param string $id * @return mixed */public function getItemData($id)
/** * Проверить есть ли у узла дочерние * @param string $id — идентификатор узла * @return boolean */public function hasChilds($id)
/** * Получить структуры всех дочерних узлов (рекурсивно) * @var mixed id идентификатор родительского узла * @return array массив с ключами ('id','parent','order','data') */public function getChildsR($id)
/** * Получить структуры дочерних узлов * @var mixed id — идентификатор родительского узла * @return array массив с ключами ('id','parent','order','data') */public function getChilds($id)
/** * Получить идентификатор родительского узла по идентификатору дочернего * @param string $id — идентификатор дочернего узла * @return mixed string or false */public function getParentId($id)
/** * Сменить родительский узел для узла * @param mixed $id — идентификатор узла * @param mixed $newParent — идентификатор нового родительского узла * @return boolean */public function changeParent($id , $newParent)
/** * Удалить узел * @param mixed $id * @return void */public function removeItem($id)
/** * Получить структуры всех элементов (узлов) дерева * @return array массив с ключами ('id','parent','order','data') */public function getItems()
}
comments powered by DisqusПример работы с деревом:
<?php // функция построения узла function createNode($tree , $parent) { $s=''; if(!$tree->hasChilds($parent)) return ''; $childs = $tree->getChilds($parent); foreach ($childs as $k=>$v) { $s.='<div style="padding-left: 15px;"> <div class="menuItem"> <a href="'.$v['data']['code'].'">'.$v['data']['title'].'</a> <p>'.$v['data']['somedata'].'</p> </div>'; if($tree->hasChilds($v['id'])) $s.=createNode($tree , $v['id']); $s.='</div>'; } return $s; } // подготавливаем данные $data = array( array('id'=>1,'code'=>'index','parent'=>0,'order'=>0,'title'=>'Main','somedata'=>'text 1'), array('id'=>2,'code'=>'store','parent'=>0,'order'=>1,'title'=>'Store','somedata'=>'text 2'), array('id'=>3,'code'=>'catalog','parent'=>2,'order'=>0,'title'=>'Store - Catalog','somedata'=>'text 3'), array('id'=>4,'code'=>'goods','parent'=>2,'order'=>1,'title'=>'Store - Catalog - Goods','somedata'=>'text 4'), array('id'=>5,'code'=>'price','parent'=>4,'order'=>2,'title'=>'Store - Catalog - Goods - Price','somedata'=>'text 5'), ); $tree = new Tree(); // заполняем дерево данными foreach ($data as $item) { $tree->addItem( $item['id'], $item['parent'], array( 'title'=>$item['title'] , 'code'=> $item['code'] , 'somedata'=>$item['somedata'] ), $item['order'] ); } // распечатываем дерево echo createNode($tree , 0);