Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Jak zoptymalizować tą pętlę i jej rekurencję
jajcarzd1
post
Post #1





Grupa: Zarejestrowani
Postów: 215
Pomógł: 19
Dołączył: 24.12.2003
Skąd: Przemyśl

Ostrzeżenie: (0%)
-----


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ć



  1. /* tu pobieram wszystkie elementy z idparent = 0 i tworzę tablicę obiektów
  2.   bo normalnie to mi zwraca tablicę dwuwymiarową. Na każdym poziomie tworzę obiekty
  3.   gdyż nie bardzo widziałem rozwiązanie aby kombinować z określaniem kolejnego poziomu zagłębienia tablicy
  4.   a tak przekazuję referencję obiektu */
  5.  
  6. $result = $this->classMysql->ta($sql);
  7. $r = array();
  8.  
  9. foreach ($result as $item) {
  10. $object = new stdClass();
  11. $object->idCategories = $item['idCategories'];
  12. $object->item = $item['name'];
  13. $object->nodes = array();
  14. $r[] = $object;
  15. }
  16.  
  17. $this->dbGetNodes($r);
  18.  
  19.  
  20. private function dbGetNodes(&$result) {
  21.  
  22. $this->allCategories = $this->classMysql->ta("SELECT idCategories,idParent,name FROM categories ORDER BY sequence");
  23. $allIdParents = array();
  24. $this->allIdParentsAsKeys = array();
  25.  
  26. foreach ($this->allCategories as $cat) {
  27. $allIdParents[] = $cat['idParent'];
  28. }
  29.  
  30. $allIdParents = array_unique($allIdParents);
  31.  
  32. foreach ($allIdParents as $item) {
  33. $this->allIdParentsAsKeys[$item] = 1;
  34. }
  35.  
  36. for($i = 0, $ii = count($result); $i<$ii; $i++) {
  37.  
  38. $this->createNodes($result[$i]->idCategories,$result[$i]);
  39.  
  40. }
  41.  
  42.  
  43. }
  44.  
  45.  
  46. private function createNodes($idCategories,$object) {
  47.  
  48. $this->iteration++;
  49.  
  50.  
  51. for($i = 0, $ii = count($this->allCategories); $i<$ii; $i++) {
  52.  
  53. $this->iteration2++;
  54.  
  55. if($this->allCategories[$i]['idParent'] == $idCategories) {
  56.  
  57. $ob = new stdClass();
  58. $ob->idCategories = $this->allCategories[$i]['idCategories'];
  59. $ob->item = $this->allCategories[$i]['name'];
  60. $ob->nodes = array();
  61.  
  62. $object->nodes[] = $ob;
  63.  
  64. /*
  65. if(in_array($allCategories[$i]['idCategories'],$allIdParents)) {
  66. $this->createNodes($allCategories[$i]['idCategories'],$ob,$allCategories,$allIdParents);
  67. }
  68. */
  69.  
  70. /* szybsze niż in_array */
  71.  
  72. if(isset($this->allIdParentsAsKeys[$this->allCategories[$i]['idCategories']])) {
  73. $this->createNodes($this->allCategories[$i]['idCategories'],$ob);
  74. }
  75.  
  76.  
  77. }
  78.  
  79.  
  80. }
  81.  
  82. }


Jakby ktoś miał jakis pomysł jak to zoptymalizować to byłbym wdzięczny.
Pozdrawiam
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 15:50