energine
[ class tree: energine ] [ index: energine ] [ all elements ]

Source for file TreeConverter.class.php

Documentation is available at TreeConverter.class.php

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