Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Ocena rozwiązania
Forum PHP.pl > Forum > Przedszkole
adam882
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.
wNogachSpisz
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.

Lombi
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. }
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.