Source for file TreeConverter.class.php
Documentation is available at TreeConverter.class.php
* Содержит класс TreeConverter
* @copyright Energine 2007
//require_once('TreeNodeList.class.php');
* Конвертер для превращения древовидного массива в объект Tree
* По сути представляет из себя контейнер статических методов
* Имя поля - родительского ключа
* Превращает переданный массив в дерево
* @param array Загружаемые данные
* @param string название поля содержащего идентификатор
* @param string название поля содержащего идентификатор родителя
static public function convert(array $data, $keyName, $parentKeyName) {
self::$keyName = $keyName;
self::$parentKeyName = $parentKeyName;
//Проверяем данные на правильность
if (!self::validate($data)) {
throw new Exception('Неправильный формат древовидных данных');
return self::iterate($data, self::$treeNodeList = new TreeNodeList());
* Проверяет входные данные на валидность
static private function validate(array $data) {
foreach ($data as $value) {
if (!array_key_exists(self::$parentKeyName, $value) || !array_key_exists(self::$parentKeyName, $value)) {
elseif($value[self::$keyName] === $value[self::$parentKeyName]) {
* Рекурсивный метод итерации по исходному древовидному массиву
* @param array массив данных в формате array(array('$keyName'=>$key, '$parentKeyName'=>$parentKey))
* @param mixed родительский объект (может быть TreeNode или TreeNodeList)
static private function iterate(array $data, $parent) {
foreach ($data as $key => $value) {
//Если родителем является TreeNodeList - значит мы на начальном шаге итерации и ключ - пустой, во всех других случаях - ключом является идентификатор узла родителя
$parentKey = $parent->getID();
$methodName = 'addChild';
if ($value[self::$parentKeyName] == $parentKey) {
//добавляем узел к родителю
$addedNode = $parent->$methodName(new TreeNode($value[self::$keyName]));
//удаляем из массива данных
//делаем рекурсивный вызов, передавая изменившийся набор данных, и родительский узел
self::iterate($data, $addedNode);
|