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
 
Start new topic
Odpowiedzi
croc
post
Post #2





Grupa: Zarejestrowani
Postów: 706
Pomógł: 108
Dołączył: 12.03.2010

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


Aha, zawarłeś to jednak w pierwszej części for, no to ok - liczy raz. Nie wczytałem się dokładnie w kod, sorry (IMG:style_emoticons/default/smile.gif) Ale uważam, że takie upychanie na siłę kodu nie jest zbyt dobrym pomysłem. Wprawdzie masz argument, że tego counta liczysz tylko na chwilę, dla pętli, ale chyba lepiej jak widać od razu poszczególne części for.
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: 14.10.2025 - 00:42