Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Grupowanie kategorii
Forum PHP.pl > Forum > Przedszkole
markuz
Witam,

Posiadam tabelę kategorie o polach id, name, sub_id

Przykładowe dane:

id name sub_id
1 a 0
2 b 1
3 c 1
4 d 0

Chciałbym aby kategorie zostały pogrupowane według głównych kategorii (czyli wtedy gdy sub_id == 0) np.

Kategoria a
- Kategoria b
- Kategoria c
Kategoria d

Proszę o pomoc smile.gif
Pozdrawiam
nospor
http://nospor.pl/grupowanie-wynikow.html
markuz
Trafiłem na Twój artykuł wcześniej aczkolwiek myślałem, że da się to zrobić bez użycia PHP w czystym SQL. Da się? smile.gif
nospor
Moglbys uzywac LEFT JOIN, ale i tak wowczas nie uzyskasz dokladnie tego co napisales.
W czystym mysql raczej nie dojdziesz do kladnie do tego co tu pokazales ze chcesz miec. baza tak nie zwraca danych. Uzyskaszdane w postaci

Kategoria a kategoria b
Kategoria a kategoria c
Kategoria d null

a nie o to ci chodzi. Tak czy siak bedziesz to musial obrobic w php by wlasciwie wyswietlic na stronie
markuz
Ok. Dzięki za pomoc. Dla innych rozwiązanie gdyby ktoś potrzebował:
  1. foreach($categories as $cat)
  2. {
  3. if($cat['parent_cat_id'] == 0)
  4. {
  5. $group_categories[$cat['id']] = array(
  6. 'name' => $cat['name'],
  7. 'sub' => FALSE,
  8. );
  9. }
  10. else
  11. {
  12. $group_categories[$cat['parent_cat_id']]['sub'][] = array(
  13. 'id' => $cat['id'],
  14. 'name' => $cat['name'],
  15. );
  16. }
  17. }
nospor
Nie zadne 'sub' => FALSE tylko 'sub' => array() W arcie masz to wyraznie zaznaczone.
Twoim sposobem lecisz potem podkategorie i dodajesz element tablicy do FALSE.... No troche logiki.

I jak juz podajesz rozwiazanie dla potomnych to przydaloby napisac skadzes wytrzasnal tablice $categories. Bądź konsekwentny, bo bez tej informacji twoje rozwiazanie dla potomnych jest do niczego.
markuz
Ja wolę 'sub' => FALSE ponieważ przy wyświetlaniu łatwo mogę sobie sprawdzić czy podkategorie istnieją, jeśli nie istnieją to zmienna 'sub' == FALSE jeśli istnieją to 'sub' jest tablicą.
nospor
do tego sluzy EMPTY ktore czy to false, czy pusta tablica zwraca ci to samo i nie ma zadnego problemu
A wg. twojej logiki jak pisalem dodajesz nagle ni z gruszki ni zpietruszki cos do FALSE. Skoro cos moze byc tablicą, to powinno to byc jawnie zaznaczone przez array(). Ucz sie pisac poprawnie.
markuz
W takim razie daję całość poprawioną dla potomnych smile.gif
Kontroler:
  1. $group_categories = array();
  2. $categories = $this->categories_MD->get();
  3. if($categories->num_rows() > 0)
  4. {
  5. foreach($categories->result_array() as $cat)
  6. {
  7. if($cat['parent_cat_id'] == 0)
  8. {
  9. $group_categories[$cat['id']] = array(
  10. 'name' => $cat['name'],
  11. 'sub' => array(),
  12. );
  13. }
  14. else
  15. {
  16. $group_categories[$cat['parent_cat_id']]['sub'][] = array(
  17. 'id' => $cat['id'],
  18. 'name' => $cat['name'],
  19. );
  20. }
  21. }
  22. }

Widok:
  1. <?php
  2. if(!empty($group_categories)) {
  3. echo '<ul>';
  4. foreach($group_categories as $parent_category) {
  5. echo '<li>'.$parent_category['name'];
  6. if(!empty($parent_category['sub']))
  7. {
  8. echo '<ul>';
  9. foreach($parent_category['sub'] as $sub_category)
  10. {
  11. echo '<li>'.$sub_category['name'].'</li>';
  12. }
  13. echo '</ul>';
  14. }
  15. echo '</li>';
  16. }
  17. echo '</ul>';
  18. }
  19. ?>

Mam nadzieję, że wszystko jest już poprawnie napisane smile.gif
Całość pisana na frameworku CodeIgniter.
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.