ugrás a tartalomhoz

Php - fa kezelése

inf · 2010. Aug. 4. (Sze), 00.22
Sziasztok!

Szeretnék fa kezelő osztályt készíteni php-ben, de egy kicsit elakadtam. Mmint azzal kapcsolatban, hogy hogyan is kéne ezt.

Konkrétan arra gondoltam, hogy tömbbe rakom a kulcsokat és szerializálom a tömböt, így kapok egy hashKey-t, amivel már le tudom tárolni a fa alkotóit egy szimpla tömbben. Gondolom feltaláltam a spanyol viaszt :-) Nem is ez a lényeg, hanem hogy ez így mennyire optimális, vagy hogy érdemes e egyáltalán így tárolni?

(Készítettem egy ilyen fát felhasználó osztályt, és a végeredmény szerintem elég lassú lett, viszont van egy olyan előnye, hogy nem kell törődni azzal, hogy egy levél megadásánál az összes szülő ágat hozzáadjam a rendszerhez.)

Ha esetleg tudnátok ezzel kapcsolatban bármilyen irodalmat, weblapot, ilyesmit ajánlani, azt megköszönném. Próbáltam keresni, de sajnos nem tudom, hogy mi a kifejezés erre a fa megvalósítási módszerre.
 
1

Hierarchikus adatkezelés SQL-lel PHP-ben

Poetro · 2010. Aug. 4. (Sze), 00.28
Ajánlom olvasd el a teljes cikksorozatot a témában: Hierarchikus adatkezelés SQL-lel PHP-ben
2

Köszi, de már olvastam meg

inf · 2010. Aug. 4. (Sze), 01.15
Köszi, de már olvastam meg használtam is, amúgy nagyon jó cikksorozat.
Nekem nem az SQL-el van gondom, de mutatok példákat, hogy érthetőbb legyen:

DOM szerű tárolási mód:
  1. class Tree1  
  2. {  
  3.     public $children=array();  
  4.     public $data;  
  5.       
  6.     public function __construct($data='generált')  
  7.     {  
  8.         $this->data=$data;  
  9.     }  
  10.       
  11.     public function put($keyList,Tree1 $value)  
  12.     {  
  13.         $k=array_pop($keyList);  
  14.         $current=$this;  
  15.         foreach ($keyList as $key)  
  16.         {  
  17.             if (!isset($current->children[$key]))  
  18.             {  
  19.                 $current->children[$key]=new Tree1();  
  20.             }  
  21.             $current=$current->children[$key];  
  22.         }  
  23.         $current->children[$k]=$value;  
  24.         return $this;  
  25.     }  
  26.       
  27.     public function get($keyList)  
  28.     {  
  29.         $current=$this;  
  30.         foreach ($keyList as $key)  
  31.         {  
  32.             if (!isset($current->children[$key]))  
  33.             {  
  34.                 return;  
  35.             }  
  36.             $current=$current->children[$key];  
  37.         }  
  38.         return $current;  
  39.     }  
  40. }  
  41.   
  42. $t=new Tree1('gyökér');  
  43. $t->put(array('a','b','c'),new Tree1('egy levél'));  
  44. echo $t->get(array('a','b','c'))->data;  
  45. echo '<br />';  
  46. echo '<pre>';  
  47. var_dump($t);  
  48. echo '</pre>';  
Map-es tárolási mód:
  1. class Tree2  
  2. {  
  3.     public $map=array();  
  4.       
  5.     protected function hashCode($keyList)  
  6.     {  
  7.         return serialize($keyList);  
  8.     }  
  9.       
  10.     public function put($keyList,$data)  
  11.     {  
  12.         $this->map[$this->hashCode($keyList)]=&$data;  
  13.         return $this;  
  14.     }  
  15.       
  16.     public function get($keyList)  
  17.     {  
  18.         if (isset($this->map[$this->hashCode($keyList)]))  
  19.         {  
  20.             return $this->map[$this->hashCode($keyList)];  
  21.         }  
  22.     }  
  23. }  
  24.   
  25. $t=new Tree2();  
  26. $t->put(array('a','b','c'),'ez egy levél');  
  27. echo $t->get(array('a','b','c'));  
  28. echo '<br />';  
  29. echo '<pre>';  
  30. var_dump($t);  
  31. echo '</pre>';  
A másodikat vagy ahhoz hasonlót szeretnék használni, de ha lehet a fentinél hatékonyabb algoritmussal. (Már ha van ilyen.)
5

Na gányoltam egy olyan

inf · 2010. Aug. 5. (Cs), 05.32
Na gányoltam egy olyan osztályt, ami nekem kell. Egész jól használható a speckó multitonomhoz. Majd valszeg bővülni fog még néhány dologgal. Nem próbáltam még, hogy a Node-kből összerakott fánál gyorsabb e, de ránézésre bizonyos helyzetekben mindenképp jobb...
  1. class Tree implements \IteratorAggregate  
  2. {  
  3.     static public function instance()  
  4.     {  
  5.         $class=get_called_class();  
  6.         return new $class();  
  7.     }  
  8.   
  9.     protected $delimiter='/';  
  10.     protected $absolute='';  
  11.     protected $value_map;  
  12.     protected $instance_map;  
  13.       
  14.     public function __construct()  
  15.     {  
  16.         $this->value_map=array();  
  17.         $this->instance_map=array();  
  18.         $this->instance_map[$this->absolute]=$this;  
  19.     }  
  20.       
  21.     public function setDelimiter($delimiter)  
  22.     {  
  23.         $this->delimiter=$delimiter;  
  24.         return $this;  
  25.     }  
  26.       
  27.     public function getDelimiter()  
  28.     {  
  29.         return $this->delimiter;  
  30.     }  
  31.       
  32.     public function getIterator()  
  33.     {  
  34.         return new \ArrayIterator($this->value_map);  
  35.     }  
  36.       
  37.     protected function absolute($key)  
  38.     {  
  39.         return ($key=='' || $key=='.')  
  40.             ?$this->absolute  
  41.             :(  
  42.                 ($key=='..')  
  43.                 ?substr($this->absolute,strrpos($this->absolute,$this->delimiter))  
  44.                 :($this->absolute.$this->delimiter.$key)  
  45.             );  
  46.     }  
  47.       
  48.     public function put($key,&$value)  
  49.     {  
  50.         $this->value_map[$this->absolute($key)]=&$value;  
  51.         return $this;  
  52.     }  
  53.       
  54.     public function contains($key)  
  55.     {  
  56.         return isset($this->value_map[$this->absolute($key)]);  
  57.     }  
  58.       
  59.     public function &get($key)  
  60.     {  
  61.         return $this->value_map[$this->absolute($key)];  
  62.     }  
  63.       
  64.     public function select($key)  
  65.     {  
  66.         $absolute=$this->absolute($key);  
  67.         if (!isset($this->instance_map[$absolute]))  
  68.         {  
  69.             $class=get_called_class();  
  70.             $tree=new $class();  
  71.             $tree->absolute=$absolute;  
  72.             $tree->delimiter=&$this->delimiter;  
  73.             $tree->value_map=&$this->value_map;  
  74.             $tree->instance_map=&$this->instance_map;  
  75.             $this->instance_map[$absolute]=$tree;  
  76.         }  
  77.         return $this->instance_map[$absolute];  
  78.     }  
  79. }  
3

Composite patternt nézted

Ifju · 2010. Aug. 4. (Sze), 10.06
Composite patternt nézted már?
4

Igen, ismerem a Composite

inf · 2010. Aug. 4. (Sze), 13.12
Igen, ismerem a Composite pattern-t.