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
phpion
post
Post #2





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




@jajcarzd1:
Nie słuchaj ~crona ani ~marcio odnośnie tej pętli. Pierwotnie, czyli tak:
  1. for($i = 0, $ii = count($this->allCategories); $i<$ii; $i++) {

miałeś dobrze.
Go to the top of the page
+Quote Post
jajcarzd1
post
Post #3





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

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


Cytat(phpion @ 20.05.2010, 13:21:31 ) *
@jajcarzd1:
Nie słuchaj ~crona ani ~marcio odnośnie tej pętli. Pierwotnie, czyli tak:
  1. for($i = 0, $ii = count($this->allCategories); $i<$ii; $i++) {

miałeś dobrze.



No do tego rozwiązania jestem przekonany że miałem dobrze, ale oczywiście w każdej rekurencji pętla leci od nowa więc tam jest ponownie odpalany count(), ale tak jak napisałem przerzucenie jego wyniku do właściwości obiektu praktycznie nic nie dało bo to zbyt mały zysk.
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: 13.10.2025 - 05:42