Source for file TreeConverter.class.php

Documentation is available at TreeConverter.class.php

  1. /**
  2.  * Содержит класс TreeConverter
  3.  *
  4.  * @package energine
  5.  * @subpackage core
  6.  * @author dr.Pavka
  7.  * @copyright ColoCall 2007
  8.  * @version $Id: fsource_energine_core_frameworkTreeConverter.class.php.html,v 1.1 2007/09/17 14:32:35 pavka Exp $
  9.  */
  10.  
  11. require_once('TreeNodeList.class.php');
  12.  
  13. /**
  14.  * Конвертер для превращения древовидного массива в объект Tree
  15.  *
  16.  *
  17.  * @package energine
  18.  * @subpackage core
  19.  */
  20. class TreeConverter{
  21.     /**
  22.      * Имя поля - ключа
  23.      *
  24.      * @var string 
  25.      * @access private
  26.      * @static
  27.      */
  28.     static private $keyName;
  29.     /**
  30.      * Имя поля - родительского ключа
  31.      *
  32.      * @var string 
  33.      * @access private
  34.      * @static
  35.      */
  36.     static private $parentKeyName;
  37.  
  38.     /**
  39.      * Список узлов
  40.      *
  41.      * @var TreeNodeList 
  42.      * @access private
  43.      * @static
  44.      */
  45.     static private $treeNodeList;    
  46.     
  47.  
  48.     private function __construct({}
  49.  
  50.     /**
  51.      * Превращает переданный массив в дерево
  52.      *
  53.      * @param array Загружаемые данные
  54.      * @param string название поля содержащего идентификатор
  55.      * @param string название поля содержащего идентификатор родителя
  56.      * @return TreeNodeList 
  57.      * @access public
  58.      * @static
  59.      */
  60.  
  61.     static public function convert(array $data$keyName$parentKeyName{
  62.         self::$keyName $keyName;
  63.         self::$parentKeyName $parentKeyName;
  64.         
  65.         //Проверяем данные на правильность
  66.         if (!self::validate($data)) {
  67.             throw new Exception('Неправильный формат древовидных данных');
  68.         }
  69.         return self::iterate($dataself::$treeNodeList new TreeNodeList());
  70.     }
  71.  
  72.     /**
  73.      * Проверяет входные данные на валидность
  74.      *
  75.      * @param array 
  76.      * @return bool 
  77.      * @access private
  78.      * @static
  79.      * @todo реализовать
  80.      */
  81.  
  82.     static private function validate(array $data{
  83.         foreach ($data as $value{
  84.             if (!array_key_exists(self::$parentKeyName$value|| !array_key_exists(self::$parentKeyName$value)) {
  85.                 return false;
  86.             }
  87.             elseif($value[self::$keyName=== $value[self::$parentKeyName]{
  88.                 return false;
  89.             }
  90.         }
  91.         return true;
  92.     }
  93.  
  94.     /**
  95.      * Рекурсивный метод итерации по исходному древовидному массиву
  96.      *
  97.      * @param array массив данных в формате array(array('$keyName'=>$key, '$parentKeyName'=>$parentKey))
  98.      * @param mixed родительский объект (может быть TreeNode или TreeNodeList)
  99.      * @return TreeNodeList 
  100.      * @access private
  101.      * @static
  102.      */
  103.  
  104.     static private function iterate(array $data$parent{
  105.         foreach ($data as $key => $value{
  106.             //Если родителем является TreeNodeList  - значит мы на начальном шаге итерации и ключ - пустой, во всех других случаях - ключом является идентификатор узла родителя
  107.             $parentKey ($parent instanceof TreeNodeList)?'':$parent->getID();
  108.             //имя метода
  109.             $methodName ($parent instanceof TreeNodeList)?'add':'addChild';
  110.             
  111.             if ($value[self::$parentKeyName== $parentKey{
  112.                 //добавляем узел к родителю
  113.                 $addedNode $parent->$methodName(new TreeNode($value[self::$keyName]));
  114.                 //удаляем из массива данных
  115.                 unset($data[$key]);
  116.                 //делаем рекурсивный вызов, передавая изменившийся набор данных, и родительский узел
  117.                 self::iterate($data$addedNode);
  118.             }
  119.         }
  120.         return $parent;
  121.     }
  122. }

Documentation generated on Mon, 17 Sep 2007 13:32:58 +0300 by phpDocumentor 1.4.0a2