Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Ocena rozwiązania
adam882
post 5.02.2012, 10:43:41
Post #1





Grupa: Zarejestrowani
Postów: 289
Pomógł: 1
Dołączył: 2.11.2007

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


Witam

Chcę w swoim serwisie internetowym system kategorii 3 rzędu (tzn. wybieramy najpierw 1, potem 2, a na końcu 3). Na początku chcę przypisać do 3 zmiennych listę kategorii 1, 2 i 3 rzędu w postaci tablicy (aby później ewentualnie wrzucić to w cache), a następnie przy pomocy pętli sprawdzać, czy się zawierają.

Struktura tabeli z kategoriami
id | parent | parent2 | nazwa | seonazwa | ile

  1. //Kategorie główne
  2. $kategorie1=array();
  3. $q1=mysql_query('SELECT id, nazwa FROM kategorie WHERE parent=0 AND parent2=0 ORDER BY seonazwa ASC');
  4. if(mysql_num_rows($q1)>0)
  5. {
  6. while($r1=mysql_fetch_assoc($q1))
  7. {
  8. $kategorie1[]=$r1;
  9. }
  10. }
  11. ////////
  12.  
  13. //Podkategorie pierwsze
  14. $kategorie2=array();
  15. $q1=mysql_query('SELECT id, nazwa, parent FROM kategorie WHERE parent<>0 AND parent2=0 ORDER BY seonazwa ASC');
  16. if(mysql_num_rows($q1)>0)
  17. {
  18. while($r2=mysql_fetch_assoc($q1))
  19. {
  20. $kategorie2[]=$r2;
  21. }
  22. }
  23. ///
  24.  
  25. //Podkategorie trzecie
  26. $kategorie3=array();
  27. $q1=mysql_query('SELECT id, nazwa, parent2 FROM kategorie WHERE parent<>0 AND parent2<>0 ORDER BY seonazwa ASC');
  28. if(mysql_num_rows($q1)>0)
  29. {
  30. while($r3=mysql_fetch_assoc($q1))
  31. {
  32. $kategorie3[]=$r3;
  33. }
  34. }
  35. ///
  36. for($x=0; $x<count($kategorie1); $x++)
  37. {
  38. echo '<b>'.$kategorie1[$x]['nazwa'].'</b><br />'; //kategoria główna
  39. for($y=0; $y<count($kategorie2); $y++)
  40. {
  41. if($kategorie1[$x]['id']==$kategorie2[$y]['parent'])
  42. {
  43. echo '-> '.$kategorie2[$y]['nazwa'].'<br />'; //podkategorie pierwszego rzędu
  44.  
  45. for($z=0; $z<count($kategorie3);$z++)
  46. {
  47. if($kategorie2[$y]['id']==$kategorie3[$z]['parent2'])
  48. {
  49. echo '---> '.$kategorie3[$z]['nazwa'].'<br />'; //podkategoria drugiego rzędu
  50. }
  51. }
  52.  
  53. }
  54. }
  55. }
  56. ///

Wszystko niby działa i generuje wynik mniej więcej w takiej postaci:

Kategoria_glowna_1
-> Podkategoria_pierwsza1
---> Podkategoria_druga1
---> Podkategoria_druga2
-> Podkategoria_pierwsza2
-> Podkategoria_pierwsza3
Kategoria_glowna_2
Kategoria_glowna_3


Jednak zastanawia mnie, czy nie za bardzo przekombinowałem z pętlami i czy takie rozwiązanie wydaje się optymalne.
Go to the top of the page
+Quote Post
wNogachSpisz
post 5.02.2012, 12:08:32
Post #2





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


Ogólnie SQL nie nadaje się dobrze do przechowywania danych zorganizowanych hierarchicznie.
Lepiej nadaje się do tego XML albo jakaś lightowy container, np. JSON.
W XML czy JSON swobodnie da się zapisywać co jest potomkiem czego, nie potrzeba żadnej nadmiarowości aby dodać kolejny element.

Oczywiście są sposoby aby wydajnie przechowywać dane zorganizowane hierarchiczne w bazie SQL.

http://www.google.pl/search?q=hierarchy+sql

Przez grzeczność nie będę się pastwił nad zaprezentowanym przez Ciebie rozwiązaniem.

Go to the top of the page
+Quote Post
Lombi
post 5.02.2012, 12:19:00
Post #3





Grupa: Zarejestrowani
Postów: 237
Pomógł: 11
Dołączył: 12.04.2006

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


Jeśli juz musisz w ten sposób, to ja bym to zrobił nieco inaczej. Bez orania bazy smile.gif
Tabela w bazie:
id | parent | nazwa | link | pozycja
1 | 0 | rodzic1| aa1 | 1
2 | 1 | dziec1 | bb1 | 1
itd...
  1. function check_child($arr,$id)
  2. {
  3. if(count($arr)>0)
  4. {
  5. foreach($arr as $val)
  6. {
  7. if($val['parent']==$id)
  8. {
  9. $tab[]=$val;
  10. $sub=check_child($arr,$val['id']);
  11. $num=count($sub);
  12. for($i=0;$i<$num;$i++)
  13. {
  14. $tab[]=$sub[$i];
  15. }
  16. }
  17. }
  18. }
  19. return $tab;
  20. }


  1. $q1=mysql_query('SELECT * FROM kategorie');
  2. while($r=mysql_fetch_assoc($q1))
  3. {
  4. $kategorie[]=$r;
  5. }
  6. $dane=check_child($kategorie,0);
  7. foreach($dane as $r)
  8. {
  9. echo $r['id'].' '.$r['nazwa'].'<br>';
  10. }


Ten post edytował Lombi 5.02.2012, 12:22:48


--------------------
znowu pomyliłem dwukropek ze średnikiem i starciłem pół dnia na szukanie błędu :)
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 24.07.2025 - 19:55