<?php
/**
* СодеÑÐ¶Ð¸Ñ ÐºÐ»Ð°ÑÑ TreeConverter
*
* @package energine
* @subpackage core
* @author dr.Pavka
* @copyright ColoCall 2007
* @version $Id: TreeConverter.class.php,v 1.3 2007/12/17 14:16:03 pavka Exp $
*/
//require_once('TreeNodeList.class.php');
/**
* ÐонвеÑÑÐµÑ Ð´Ð»Ñ Ð¿ÑевÑаÑÐµÐ½Ð¸Ñ Ð´Ñевовидного маÑÑива в обÑÐµÐºÑ Tree
*
*
* @package energine
* @subpackage core
*/
class TreeConverter{
/**
* ÐÐ¼Ñ Ð¿Ð¾Ð»Ñ - клÑÑа
*
* @var string
* @access private
* @static
*/
static private $keyName;
/**
* ÐÐ¼Ñ Ð¿Ð¾Ð»Ñ - ÑодиÑелÑÑкого клÑÑа
*
* @var string
* @access private
* @static
*/
static private $parentKeyName;
/**
* СпиÑок Ñзлов
*
* @var TreeNodeList
* @access private
* @static
*/
static private $treeNodeList;
private function __construct() {}
/**
* ÐÑевÑаÑÐ°ÐµÑ Ð¿ÐµÑеданнÑй маÑÑив в деÑево
*
* @param array ÐагÑÑжаемÑе даннÑе
* @param string название Ð¿Ð¾Ð»Ñ ÑодеÑжаÑего иденÑиÑикаÑоÑ
* @param string название Ð¿Ð¾Ð»Ñ ÑодеÑжаÑего иденÑиÑикаÑÐ¾Ñ ÑодиÑелÑ
* @return TreeNodeList
* @access public
* @static
*/
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());
}
/**
* ÐÑовеÑÑÐµÑ Ð²Ñ
однÑе даннÑе на валидноÑÑÑ
*
* @param array
* @return bool
* @access private
* @static
* @todo ÑеализоваÑÑ
*/
static private function validate(array $data) {
foreach ($data as $value) {
if (!array_key_exists(self::$parentKeyName, $value) || !array_key_exists(self::$parentKeyName, $value)) {
return false;
}
elseif($value[self::$keyName] === $value[self::$parentKeyName]) {
return false;
}
}
return true;
}
/**
* РекÑÑÑивнÑй меÑод иÑеÑаÑии по иÑÑ
Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð´ÑÐµÐ²Ð¾Ð²Ð¸Ð´Ð½Ð¾Ð¼Ñ Ð¼Ð°ÑÑивÑ
*
* @param array маÑÑив даннÑÑ
в ÑоÑмаÑе array(array('$keyName'=>$key, '$parentKeyName'=>$parentKey))
* @param mixed ÑодиÑелÑÑкий обÑÐµÐºÑ (Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ TreeNode или TreeNodeList)
* @return TreeNodeList
* @access private
* @static
*/
static private function iterate(array $data, $parent) {
foreach ($data as $key => $value) {
//ÐÑли ÑодиÑелем ÑвлÑеÑÑÑ TreeNodeList - знаÑÐ¸Ñ Ð¼Ñ Ð½Ð° наÑалÑном Ñаге иÑеÑаÑии и клÑÑ - пÑÑÑой, во вÑеÑ
дÑÑгиÑ
ÑлÑÑаÑÑ
- клÑÑом ÑвлÑеÑÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ Ñзла ÑодиÑелÑ
$parentKey = ($parent instanceof TreeNodeList)?'':$parent->getID();
//Ð¸Ð¼Ñ Ð¼ÐµÑода
$methodName = ($parent instanceof TreeNodeList)?'add':'addChild';
if ($value[self::$parentKeyName] == $parentKey) {
//добавлÑем Ñзел к ÑодиÑелÑ
$addedNode = $parent->$methodName(new TreeNode($value[self::$keyName]));
//ÑдалÑем из маÑÑива даннÑÑ
unset($data[$key]);
//делаем ÑекÑÑÑивнÑй вÑзов, пеÑÐµÐ´Ð°Ð²Ð°Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ð²ÑийÑÑ Ð½Ð°Ð±Ð¾Ñ Ð´Ð°Ð½Ð½ÑÑ
, и ÑодиÑелÑÑкий Ñзел
self::iterate($data, $addedNode);
}
}
return $parent;
}
}