Autor Zpráva
Pinqui
Profil
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
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
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ů.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: