Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Podzial na dowolna ilosc kategorii i podkategorii
Forum PHP.pl > Forum > PHP
mihaup
Witam,

od dwoch dni usiluje zrobic podział na kategorie z dowolna iloscia podkategorii w php + mysql, ktore bede mogl potem wyswietlic za pomoca list w html.
Jestem po lekturze:
- Drzewa w php i MySQL, ZYX: http://artykuly.zyxist.com/czytaj.php/drzewa_w_php_i_mysql
- Storing Hierarchical Data in a Database, Gijs Van Tulder: http://www.sitepoint.com/article/hierarchical-data-database
- Drzewka w php, http://wortal.php.pl/phppl/wortal/artykuly...ny_wyglad_klasy

Artykuły te są dla mnie zrozumiałe, lecz chce po pobraniu dane, ktore mam w takiej postaci:
( wciecia sa robione za pomoca str_repeat() w w/w artach. )
-root
-sub1
--sub1.1
--sub1.2
---sub1.2.1
-sub2
--sub2.1

chce sformatowac do html:
  1. <ul>
  2. <li>Sub1
  3. <ul>
  4. <li>sub1.1</li>
  5. <li>sub1.2</li>
  6. </ul>
  7. </li>
  8. <li>sub2
  9. <ul><li>sub2.1</li></ul>
  10. </li>
  11. </ul>
  12. </li>
  13. </ul>


Jakies pomysly na rozwiazanie mojego problemu? Jak Wy rozwiazujecie tego typu problem? Z gory dzieki.
Ziels
Rekurencja? Iteracja ze stosem?

Struktura mysql:
Kod
+-----+----+------+
| Title | ID | IDUP |
+-----+----+------+
|  coś |  1  |  def  |
| inne |  2  |  1    |
| bla   |  3  |  2    |
| blab |  4  |  3    |
+-----+----+------+


  1. <?php
  2. function pobierz($zapytanie){
  3.  
  4. $ret = '<ul>';
  5. while($row = mysql_fetch_array($zapytanie)){
  6.  $ret .= '<li>' . $row['title'] . '</li>';
  7.  if( mysql_fetch_array( mysql_query("SELECT * FROM baza WHERE idup = '" . $row['id'] . "' ") ){
  8. pobierz(mysql_query("SELECT * FROM baza WHERE idup = '" . $row['id'] . "'"));
  9.  }
  10. }
  11. $ret .= '</ul>';
  12.  
  13.  
  14. return $ret;
  15. }
  16.  pobierz(mysql_query("SELECT * FROM baza WHERE idup = 'def'"));
  17. ?>


Pisane z palca, nie wiem czy działa ;p
mihaup
@Ziels:

Dzieki smile.gif Nie moze byc return na koncu, bo zatrzymuje funkcje.
Skrypt generuje "plaskie" listy, tzn.
  1. <ul>
  2. <li>sub1</li>
  3. </ul>
  4. <ul>
  5. <li>sub1.1</li>
  6. </ul>


zamiast
  1. <ul>
  2. <li>sub1
  3. <ul>
  4. <li>sub1.1</li>
  5. </ul>
  6. </li>
  7. </ul>
Ziels
  1. <?php
  2. function pobierz($zapytanie, $i){
  3.  
  4. $ret = '<ul>';
  5. while($row = mysql_fetch_array($zapytanie)){
  6.  $ret .= '<li>' . $row['title'];
  7.  if( mysql_fetch_array( mysql_query("SELECT * FROM baza WHERE idup = '" . $row['id'] . "' ") ){
  8. pobierz(mysql_query("SELECT * FROM baza WHERE idup = '" . $row['id'] . "'"), $i+1);
  9.  }
  10.  $ret .= '</li>';
  11. }
  12. $ret .= '</ul>';
  13. if($i==1){
  14. return $ret;
  15. }
  16. }
  17.  pobierz(mysql_query("SELECT * FROM baza WHERE idup = 'def'"), 1);
  18. ?>


Powinno być ok
mihaup
Hej,
dzieki za pomoc Ziels. Ostatecznie funkcja wygląda:

  1. <?php
  2. public function getHtml($parentId, $ret='') {
  3.  
  4. $ret .= '<ul>';
  5. $sql = "SELECT * FROM kategorie WHERE parentId = $parentId";
  6. $query = $this->CI->db->query($sql);
  7. $result = $query->result();
  8. foreach($result as $row) {
  9. $ret .= "n<li class=''>" . $row->title;
  10.  
  11. $sql = "SELECT COUNT(id) as ile FROM kategorie WHERE parentId = $row->id";
  12. $query = $this->CI->db->query($sql);
  13. $ile = $query->row();
  14. $ile = $ile->ile;
  15. if($ile ){
  16. $this->getHtml($row->id, &$ret);
  17.  }
  18.  $ret .= '</li>';
  19. }
  20. $ret .= '</ul>';
  21.  
  22. return $ret;
  23. }
  24. ?>


Zapytania tak a nie inaczej, bo dla FW CodeIgniter ;-)
w MySQL tabela:
kategorie(id, title, parentId).
Pozdrawiam i jeszcze raz dzieki.
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.