Witam
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'];
$object->nodes = array(); $r[] = $object;
}
$this->dbGetNodes($r);
private function dbGetNodes(&$result) {
$this->allCategories = $this->classMysql->ta("SELECT idCategories,idParent,name FROM categories ORDER BY sequence");
$this->allIdParentsAsKeys = array();
foreach ($this->allCategories as $cat) {
$allIdParents[] = $cat['idParent'];
}
foreach ($allIdParents as $item) {
$this->allIdParentsAsKeys[$item] = 1;
}
for($i = 0
, $ii = count($result); $i<$ii; $i++) {
$this->createNodes($result[$i]->idCategories,$result[$i]);
}
}
private function createNodes($idCategories,$object) {
$this->iteration++;
for($i = 0
, $ii = count($this->allCategories); $i<$ii; $i++) {
$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 */
if(isset($this->allIdParentsAsKeys[$this->allCategories[$i]['idCategories']])) { $this->createNodes($this->allCategories[$i]['idCategories'],$ob);
}
}
}
}
Jakby ktoś miał jakis pomysł jak to zoptymalizować to byłbym wdzięczny.
Pozdrawiam