Mam w bazie danych zapisane kategorie gdzie tabela ta posiada między innymi takie nagłówki jak idCategories,idParent,name itp.
Potrzebuję wyciągnąć wszystkie kategorie wraz z ich potomkami niezależnie od stopnia zagnieżdzenia aby potem móc zrobić sobie menu np. takie http://jquery.bassistance.de/treeview/demo/?1 czyli wszystkie elementy pociągnięte od razu a nie w trakcie kliknięcia na danego potomka. Wiec konstrukcje <ul> z zagłębieniami
W tabeli kategorii jest około 1400 kategorii na chwilę obecną około 14 pierwszego poziomu czyli z idparent = 0, 165 drugiego i jakieś 1300 trzeciego poziomu. Elementy pobieram rekurencyjnie ale to nie jest za bardzo problemem a ilość pętli jaka musi być wykonana i jest ich w sumie w chwili obecnej około 240 000, czas wykonywania tej operacji to około 0,4 sekundy i tak nie mam za bardzo pomysłu co tu można jeszcze poprawić
/* tu pobieram wszystkie elementy z idparent = 0 i tworzę tablicę obiektów bo normalnie to mi zwraca tablicę dwuwymiarową. Na każdym poziomie tworzę obiekty gdyż nie bardzo widziałem rozwiązanie aby kombinować z określaniem kolejnego poziomu zagłębienia tablicy a tak przekazuję referencję obiektu */ $result = $this->classMysql->ta($sql); foreach ($result as $item) { $object = new stdClass(); $object->idCategories = $item['idCategories']; $object->item = $item['name']; $r[] = $object; } $this->dbGetNodes($r); private function dbGetNodes(&$result) { $this->allCategories = $this->classMysql->ta("SELECT idCategories,idParent,name FROM categories ORDER BY sequence"); foreach ($this->allCategories as $cat) { $allIdParents[] = $cat['idParent']; } foreach ($allIdParents as $item) { $this->allIdParentsAsKeys[$item] = 1; } $this->createNodes($result[$i]->idCategories,$result[$i]); } } private function createNodes($idCategories,$object) { $this->iteration++; $this->iteration2++; if($this->allCategories[$i]['idParent'] == $idCategories) { $ob = new stdClass(); $ob->idCategories = $this->allCategories[$i]['idCategories']; $ob->item = $this->allCategories[$i]['name']; $object->nodes[] = $ob; /* if(in_array($allCategories[$i]['idCategories'],$allIdParents)) { $this->createNodes($allCategories[$i]['idCategories'],$ob,$allCategories,$allIdParents); } */ /* szybsze niż in_array */ $this->createNodes($this->allCategories[$i]['idCategories'],$ob); } } } }
Jakby ktoś miał jakis pomysł jak to zoptymalizować to byłbym wdzięczny.
Pozdrawiam