Autor | Zpráva | ||
---|---|---|---|
Pinqui Profil |
#1 · Zasláno: 25. 12. 2012, 20:48:20
Zdravím, má někdo nějaký lepší způsob vytvoření rekurzivního stromu, než tento:
public function generateTree($parent_id = NULL) { $roles = $this->db->table(static::ROLES)->where('parent_id', $parent_id); if ($roles->count() == 0) return NULL; $array = array(); foreach ($roles as $role) { $array[$role->id]['opt'] = $role; $array[$role->id]['children'] = $this->generateTree($role->id, $role->key); } return $array; } $tree = $this->generateTree(); Potřebuji vždy vědět nějaká data o daném prvku (což nyní mám v "opt") a potom všechny jeho potomky. Díky |
||
Alphard Profil |
#2 · Zasláno: 25. 12. 2012, 23:00:32
Struktura vazby přes id rodiče není výhodná pro práci se stromem, jinak než rekurzí to řešit nejde. Pro kratší seznamy jako třeba menu lze nutnost velkého počtu požadavků na db obejít přenesením všech dat najednou a procházením pole, nebo třeba zavedením cache. V případě rozsáhlejších struktur je pro optimální práci třeba doplnit databázi o další údaje, viz interval.cz/clanky/metody-ukladani-stromovych-dat-v-relacnich-databazich.
|
||
Pinqui Profil |
#3 · Zasláno: 26. 12. 2012, 10:47:48
Pro traverzování kolem stromu mám vlastní třídu, ze které to skládám a ano cache k tomu pak též používám, jen mi jde o to, zda takto nebo jinak když jde o rekurzi. Je to k ACL, takže tam budou maximálně desítky záznamů.
|
||
Časová prodleva: 11 let
|
0