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()

}

Пример работы с деревом:

<?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);

comments powered by Disqus