Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] generowanie listy
Forum PHP.pl > Forum > PHP
AxZx
witam

przyznaje ze nie daje sobie rady z taka zagadka algorytmiczna:)

chcialbym wygenerowac liste
  1. <ul>
  2. <li>Dystrybucja
  3. <ul>
  4. <li>pod dytrybucja
  5. <ul>
  6. <li>jakies pod pod menu</li>
  7. </ul>
  8. </li>
  9. </ul>
  10. </li>
  11. <li>Współpraca</li>
  12. <li>Patronat
  13. <ul>
  14. <li>sdf sdf</li>
  15. </ul>
  16. </li>
  17. <li>Reklama</li>
  18. </ul>


mam taka tablice wejsciowa:
Kod
         Array
         (
             [0] => Array
                 (
                     [lower] => 1
                     [upper] => 0
                     [drzewo_id] => 14
                     [nazwa] => Dystrybucja
                     [childs] => 2
                     [level] => 1
                     [data] => 2007-11-08 13:22:12
                 )
        
             [1] => Array
                 (
                     [lower] => 0
                     [upper] => 0
                     [drzewo_id] => 17
                     [nazwa] => pod dytrybucja
                     [childs] => 1
                     [level] => 2
                     [data] => 2007-11-08 19:23:45
                 )
        
             [2] => Array
                 (
                     [lower] => 0
                     [upper] => 0
                     [drzewo_id] => 31
                     [nazwa] => jakies pod pod menu
                     [childs] => 0
                     [level] => 3
                     [data] => 2007-11-08 23:31:50
                 )
        
             [3] => Array
                 (
                     [lower] => 1
                     [upper] => 1
                     [drzewo_id] => 13
                     [nazwa] => Współpraca
                     [childs] => 0
                     [level] => 1
                     [data] => 2007-11-08 13:22:05
                 )
        
             [4] => Array
                 (
                     [lower] => 1
                     [upper] => 1
                     [drzewo_id] => 12
                     [nazwa] => Patronat
                     [childs] => 1
                     [level] => 1
                     [data] => 2007-11-08 13:21:57
                 )
        
             [5] => Array
                 (
                     [lower] => 0
                     [upper] => 0
                     [drzewo_id] => 32
                     [nazwa] => sdf sdf
                     [childs] => 0
                     [level] => 2
                     [data] => 2007-11-08 23:32:02
                 )
        
             [6] => Array
                 (
                     [lower] => 1
                     [upper] => 1
                     [drzewo_id] => 11
                     [nazwa] => Reklama
                     [childs] => 0
                     [level] => 1
                     [data] => 2007-11-08 13:21:51
                 )
        
         )


tutaj jeszcze dane w postaci tabelarycznej:
Kod
     lower    upper    nazwa                    childs    level
     1        0        Dystrybucja                2        1
     0        0        pod dytrybucja             1        2
     0        0        jakies pod pod menu        0        3
     1        1        Współpraca                 0        1
     1        1        Patronat                   1        1
     0        0        sdf sdf                    0        2
     1        1        Reklama                    0        1
     0        1        Karmel                     0        1
jang
Nie napisałeś więc zakładam że (jeśli już tak jest) to Array(1) będzie dzieckiem Array(0)

(nie testowałem)
  1. <?php
  2. $i = 0;
  3. $ul = 0;
  4. $li = 0;
  5. $arr = array();
  6. echo "<ul>";
  7. pobierzTablice($i);
  8.  
  9.  
  10. function pisz($tytul)
  11. {
  12. echo '<li>'.$tytul;
  13. $li++;
  14. }
  15. function pisz1()
  16. {
  17. echo '<ul>';
  18. $ul++;
  19. }
  20.  
  21. function pobierzTablice($i)
  22. {
  23.  
  24. }
  25.  
  26.  
  27. if (is_array(arr($i)) AND $arr[$i]['childs'] > 0 )
  28. {
  29. $tytul = $arr[$i]['nazwa'];
  30. $i++;
  31. pisz($tytul);
  32. pisz1();
  33. pobierzTablice($i);
  34. }
  35. else if (is_array(arr($i)) AND $arr[$i]['childs'] == 0)
  36. {
  37. $tytul = $arr[$i]['nazwa'];
  38. $i++;
  39. pisz($tytul);
  40. for($a = 0; $a < $li + 1; $a++)
  41. {
  42. echo "</li></ul>";
  43. }
  44. }
  45.  
  46.  
  47. echo "</ul>";
  48. ?>
AxZx
do czego sa funkcje pobierzTablice i arr ?
jang
Cytat(AxZx @ 9.11.2007, 19:36:39 ) *
do czego sa funkcje pobierzTablice i arr ?
Śpiący byłem i i zamiast [] dałem () - $arr to miała być tablica.
Lepiej by było gdybyś odpisał na to -> Nie napisałeś więc zakładam że (jeśli już tak jest) to Array(1) będzie dzieckiem Array(0) ale to już bez znaczenia
  1. <ul>
  2. <li>Dystrubucja
  3. <ul>
  4. <li>pod dytrybucja
  5. <ul>
  6. <li>jakies pod pod menu</li>
  7. </ul>
  8. </li>
  9. </ul>
  10. </li>
  11. <li>Współpraca</li>
  12. <li>Patronat
  13. <ul>
  14. <li>sdf sdf</li>
  15. </ul>
  16. </li>
  17. <li>Reklama</li>
  18. </ul>

Jeśli to miało wyglądać tak jak powyżej to poniżej przetestowany kodzik:
  1. <?php
  2. $tablica = array(
  3. 'A0' => array('nazwa' => 'Dystrubucja', 'childs' => '2', 'level' => '1'),
  4. 'A1' => array('nazwa' => 'pod dytrybucja', 'childs' => '1', 'level' => '2'),
  5. 'A2' => array('nazwa' => 'jakies pod pod menu', 'childs' => '0', 'level' => '3'),
  6. 'A3' => array('nazwa' => 'Współpraca', 'childs' => '0', 'level' => '1'),
  7. 'A4' => array('nazwa' => 'Patronat', 'childs' => '1', 'level' => '1'),
  8. 'A5' => array('nazwa' => 'sdf sdf', 'childs' => '0', 'level' => '2'),
  9. 'A6' => array('nazwa' => 'Reklama', 'childs' => '0', 'level' => '1'),
  10. );
  11. $i = 0;
  12. $li = 0;
  13.  
  14.  
  15. $ile = count($tablica);
  16. echo '<ul>';
  17.  
  18. function piszLI($tytul)
  19. { global $li;
  20. echo '<li>'.$tytul;
  21. $li++;
  22. }
  23. function piszUL()
  24. {
  25. echo '<ul>';
  26. }
  27.  
  28. for ($a = 0; $a < $ile; $a++)
  29. {
  30. if (is_array($tablica['A'.$a]) AND $tablica['A'.$a]['childs'] > 0 )
  31. {
  32. $tytul = $tablica['A'.$a]['nazwa'];
  33. piszLI($tytul);
  34. piszUL();
  35. }
  36. else if (is_array($tablica['A'.$a]) AND $tablica['A'.$a]['childs'] == 0)
  37. {
  38. $tytul = $tablica['A'.$a]['nazwa'];
  39. piszLI($tytul);
  40. for($a1 = 0; $a1 < $li; $a1++)
  41. {
  42. if($a1 < $li - 1)
  43. {
  44. echo "</li></ul>";
  45. }
  46. else
  47. {
  48. echo "</li>";
  49. }
  50. }
  51. $li = 0;
  52. }
  53. }
  54.  
  55. echo '</ul>';
  56. ?>
AxZx
te tablice to sa pozycje menu - pokolei.
zawsze tak bedzie ze bedzie to generowane pokolei.
trzeba uwzglednic to na ktorym poziomie jest dana pozycja w menu i ile ma dzieci.

Dystrybucja
*pod dytrybucja
**jakies pod pod menu
Współpraca
Patronat
*sdf sdf
Reklama
Karmel

Twoj kod dziala dla tych danych, ale gdy probowalem dodac kolejna pozycje w menu to juz nie za bardzo.
wlasciwie to kombinowalem podobnie jak ty tylko ze bez funkcji - nie dalem rady.
przeanalizuje jeszcze raz Twoj kod i pokombinuje cos z tym:)

dzieki bardzo.
pozdrawiam

EDIT:
np dla takiej tablicy nie dziala
  1. <?php
  2. $tablica = array(
  3. 'A0' => array('nazwa' => 'Dystrubucja', 'childs' => '3', 'level' => '1'),
  4. 'A1' => array('nazwa' => 'pod dytrybucja', 'childs' => '1', 'level' => '2'),
  5. 'A2' => array('nazwa' => 'jakies pod pod menu', 'childs' => '0', 'level' => '3'),
  6. 'A3' => array('nazwa' => 'jeszcze cos', 'childs' => '0', 'level' => '2'),
  7. 'A4' => array('nazwa' => 'Współpraca', 'childs' => '0', 'level' => '1'),
  8. 'A5' => array('nazwa' => 'Patronat', 'childs' => '2', 'level' => '1'),
  9. 'A6' => array('nazwa' => 'sdf sdf', 'childs' => '2', 'level' => '2'),
  10. 'A7' => array('nazwa' => 'pod menu sdf sdf', 'childs' => '0', 'level' => '3'),
  11. 'A8' => array('nazwa' => 'pod menu patronat', 'childs' => '0', 'level' => '2'),
  12. 'A9' => array('nazwa' => 'Reklama', 'childs' => '1', 'level' => '1'),
  13. 'A10' => array('nazwa' => 'pod menu Reklama', 'childs' => '0', 'level' => '2'),
  14. );
  15. ?>
jang
Cytat(AxZx @ 10.11.2007, 17:57:18 ) *
EDIT:
np dla takiej tablicy nie dziala

A może tak ?
  1. <?php
  2. $tablica = array(
  3. 'A0' => array('nazwa' => 'Dystrubucja', 'childs' => '3', 'level' => '1'),
  4. 'A1' => array('nazwa' => 'pod dytrybucja', 'childs' => '1', 'level' => '2'),
  5. 'A2' => array('nazwa' => 'jakies pod pod menu', 'childs' => '0', 'level' => '3'),
  6. 'A3' => array('nazwa' => 'jeszcze cos', 'childs' => '0', 'level' => '2'),
  7. 'A4' => array('nazwa' => 'Współpraca', 'childs' => '0', 'level' => '1'),
  8. 'A5' => array('nazwa' => 'Patronat', 'childs' => '2', 'level' => '1'),
  9. 'A6' => array('nazwa' => 'sdf sdf', 'childs' => '2', 'level' => '2'),
  10. 'A7' => array('nazwa' => 'pod menu sdf sdf', 'childs' => '0', 'level' => '3'),
  11. 'A8' => array('nazwa' => 'pod menu patronat', 'childs' => '0', 'level' => '2'),
  12. 'A9' => array('nazwa' => 'Reklama', 'childs' => '1', 'level' => '1'),
  13. 'A10' => array('nazwa' => 'pod menu Reklama', 'childs' => '0', 'level' => '2'),
  14. 'A11' => array('nazwa' => 'pod pod menu Reklama', 'childs' => '0', 'level' => '5'),
  15. 'A12' => array('nazwa' => 'pod pod menu Reklama', 'childs' => '0', 'level' => '4'),
  16. );
  17.  
  18. $ile = count($tablica);
  19.  
  20. function level($lev = 0, $tytul = '')
  21. {
  22. $lev1 = $lev * 4;
  23. for($a = 0; $a < $lev1; $a++)
  24. {
  25. echo ' ';
  26. }
  27. echo 'level '.$lev.' - '.$tytul.'<br />';
  28. }
  29.  
  30. for ($a = 0; $a < $ile; $a++)
  31. {
  32. if (is_array($tablica['A'.$a]) )
  33. {
  34. level($tablica['A'.$a]['level'], $tablica['A'.$a]['nazwa']);
  35. }
  36. }
  37. ?>

efekt powyższego jest taki :
  1. level 1 - Dystrubucja
  2. level 2 - pod dytrybucja
  3. level 3 - jakies pod pod menu
  4. level 2 - jeszcze cos
  5. level 1 - Współpraca
  6. level 1 - Patronat
  7. level 2 - sdf sdf
  8. level 3 - pod menu sdf sdf
  9. level 2 - pod menu patronat
  10. level 1 - Reklama
  11. level 2 - pod menu Reklama
  12. level 5 - pod pod menu Reklama
  13. level 4 - pod pod menu Reklama


W lini 25 w echo powinno być $nbsp; ale skrypt forum toto zjadł.
AxZx
nie no, takie cos wogole nie wchodzi w gre.
bo ten kod mozna zastapic zwyklym str_repeat()
smile.gif
wlasnie chodzi o zrobiebie listy na ul li po to zebym mogl zrobic fajne menu w JS - takie wiesz, klikasz i rozwija sie dana pozycja menu i wyswietlane sa childs.


EDIT:
oczywiscie chodzilo mi o funkcje str_repeat:)
jang
Mam dla Ciebie dwie dobre wiadomości smile.gifsmile.gif
Od której zacząć ?
no dobra ja zdecyduję HeHeHe.
Pierwsza. Jesteś mi winien skrzynkę piwa smile.gifsmile.gifsmile.gif
Druga. no to testuj :
  1. <?php
  2. $tablica = array(
  3. 'A0' => array('nazwa' => 'Dystrubucja', 'childs' => '3', 'level' => '1'),
  4. 'A1' => array('nazwa' => 'pod dytrybucja', 'childs' => '1', 'level' => '2'),
  5. 'A2' => array('nazwa' => 'jakies pod pod menu', 'childs' => '0', 'level' => '3'),
  6. 'A3' => array('nazwa' => 'jakies pod pod pod pod menu', 'childs' => '0', 'level' => '5'),
  7. 'A4' => array('nazwa' => 'jakies pod pod pod pod menu', 'childs' => '0', 'level' => '4'),
  8. 'A5' => array('nazwa' => 'jeszcze cos', 'childs' => '0', 'level' => '2'),
  9. 'A6' => array('nazwa' => 'Współpraca', 'childs' => '0', 'level' => '1'),
  10. 'A7' => array('nazwa' => 'Patronat', 'childs' => '2', 'level' => '1'),
  11. 'A8' => array('nazwa' => 'sdf sdf', 'childs' => '2', 'level' => '2'),
  12. 'A9' => array('nazwa' => 'pod menu sdf sdf', 'childs' => '0', 'level' => '3'),
  13. 'A10' => array('nazwa' => 'pod menu patronat', 'childs' => '0', 'level' => '2'),
  14. 'A11' => array('nazwa' => 'Reklama', 'childs' => '1', 'level' => '1'),
  15. 'A12' => array('nazwa' => 'pod menu Reklama', 'childs' => '0', 'level' => '2'),
  16. 'A13' => array('nazwa' => 'pod pod menu Reklama', 'childs' => '0', 'level' => '5'),
  17. 'A14' => array('nazwa' => 'pod pod menu Reklama', 'childs' => '0', 'level' => '4'),
  18. );
  19.  
  20. $ile = count($tablica);
  21. echo '<ul>';
  22.  
  23. function level($lev = 0, $tytul = '')
  24. {
  25. for($a = 1; $a < $lev; $a++)
  26. {
  27. echo '<ul>';
  28. }
  29. echo '<li><b>level '.$lev.' - </b>'.$tytul.'</li>';
  30. for($a = 1; $a < $lev; $a++)
  31. {
  32. echo '</ul>';
  33. }
  34. }
  35.  
  36. for ($a = 0; $a < $ile; $a++)
  37. {
  38. if (is_array($tablica['A'.$a]) )
  39. {
  40. level($tablica['A'.$a]['level'], $tablica['A'.$a]['nazwa']);
  41. }
  42. }
  43.  
  44.  
  45. echo '</ul>';
  46. ?>


EDIT: Tak przy okazji, to znasz -> http://code.gosu.pl/dl/mygosuMenu/demo/1.5/example2.html

Pozdrawiam
AxZx
Cytat(jang @ 11.11.2007, 02:22:42 ) *

znam:) i wlasnie miedzy innymi do takiego menu potrzebna jest jakas sensowna struktura w HTML. np taka jak podalem w 1 poscie.

twoj algorytm mozna przedstawic za pomoca takiego kodu
  1. <?php
  2. echo '<ul>';
  3.  
  4. foreach($tablica as $klucz=>$war){
  5.  
  6. for($i = 1; $i < $war['level']; $i++) 
  7. echo '<ul>';
  8.  
  9. echo '<li>'.$war['nazwa'].'</li>';
  10.  
  11. for($i = 1; $i < $war['level']; $i++) 
  12. echo '</ul>';
  13.  
  14. }
  15.  
  16. echo '</ul>';
  17. ?>

niestety nie jest to rozwiazanie bo <ul> w kolejnych poziomach powinny byc w <li> poziomow wyzej.
a twoj kod generuje takie cos:
  1. <ul>
  2. <li>Dystrubucja</li>
  3. <ul>
  4. <li>pod dytrybucja</li>
  5. </ul>
  6. <ul>
  7. <ul>
  8. <li>jakies pod pod menu</li>
  9. </ul>
  10. </ul>
  11. <ul>
  12. <li>jeszcze cos</li>
  13. </ul>
  14. <li>Współpraca</li>
  15. <li>Patronat</li>
  16. <ul>
  17. <li>sdf sdf</li>
  18. </ul>
  19. <ul>
  20. <ul>
  21. <li>pod menu sdf sdf</li>
  22. </ul>
  23. </ul>
  24. <ul>
  25. <li>pod menu patronat</li>
  26. </ul>
  27. <li>Reklama</li>
  28. <ul>
  29. <li>pod menu Reklama</li>
  30. </ul>
  31. </ul>

pokaza sie bledu: Missing <li>.
heaven
zobacz to
  1. <?php
  2. $actual_level = 0;
  3. foreach($tablica as $klucz=>$war){
  4. if ($war['level'] > $actual_level) {
  5. for($i = $actual_level; $i < $war['level']; $i++)
  6. echo "\n<ul>\n";
  7. $actual_level = $war['level'];
  8. }
  9. elseif ($war['level'] < $actual_level) {
  10. for($i = $war['level']; $i < $actual_level; $i++)
  11. echo "</li></ul>\n";
  12. $actual_level = $war['level'];
  13. echo "</li>\n";
  14. }
  15. else echo "</li>\n";
  16. echo '<li>'.$war['nazwa'];
  17. }
  18. for($i = 0; $i < $actual_level; $i++)
  19. echo "</li></ul>\n";
  20. ?>
AxZx
@heaven: wyglada na to ze dziala tak jak bylo zalozone:)

dziekuje bardzo.
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.