Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Wyswietlanie zawartosci tablicy rekurencyjnie
Forum PHP.pl > Forum > Przedszkole
iwosz
Witam,

chcę wyświetlić zawartość tablicy jako lista html <ul>, tablica wygląda np. tak:
  1. $test_array = Array(
  2. 0 => Array(
  3. 'id' => 10,
  4. 'parent_id' => 0,
  5. 'name' => 'Test10',
  6. 'child_nodes' => Array(
  7. 0 => Array(
  8. 'id' => 11,
  9. 'parent_id' => 10,
  10. 'name' => 'Test11',
  11. 'child_nodes' => Array()
  12. ),
  13. 1 => Array(
  14. 'id' => 12,
  15. 'parent_id' => 10,
  16. 'name' => 'Test12',
  17. 'child_nodes' => Array()
  18. )
  19. )
  20. ),
  21. 1 => Array(
  22. 'id' => 20,
  23. 'parent_id' => 0,
  24. 'name' => 'Test20',
  25. 'child_nodes' => Array(
  26. 0 => Array(
  27. 'id' => 21,
  28. 'parent_id' => 20,
  29. 'name' => 'Test21',
  30. 'child_nodes' => Array()
  31. )
  32. )
  33. )
  34. );


Więc chciał bym uzyskać kod:
  1. <ul>
  2. <li>
  3. Test10
  4. <ul>
  5. <li>
  6. Test11
  7. </li>
  8. <li>
  9. Test12
  10. </li>
  11. </ul>
  12. </li>
  13. <li>
  14. Test20
  15. <ul>
  16. <li>
  17. Test21
  18. </li>
  19. </ul>
  20. </li>
  21. </ul>


potrzebuje szybkiej wskazówki co jest nie tak w poniższym kodzie:
  1. function generate_menu_tree($tree_str, $nodes) {
  2. if( !empty( $nodes ) ) {
  3. $tree_str .= '<ul>';
  4. foreach( $nodes as $node ) {
  5. $tree_str .= '<li>';
  6. $tree_str .= strtolower($node['name']);
  7. if( !empty($node['child_nodes'])) {
  8. $tree_str .= $this->generate_menu_tree($tree_str, $node['child_nodes']);
  9. }
  10. $tree_str .= '</li>';
  11. }
  12. $tree_str .= '</ul>';
  13. }
  14. return $tree_str;
  15. }


i wywołanie:
  1. $tree_html = $this->generate_menu_tree('', $test_array);


W efekcie dostaję błędny kod w postaci:
  1. <ul>
  2. <li>Test10
  3. <ul>
  4. <li>Test10
  5. <ul>
  6. <li>Test11</li>
  7. <li>Test12</li>
  8. </ul>
  9. </li>
  10. </ul>
  11. itd...


Czy problem jest związany z wywołaniem tej funkcji czy z samą funkcją? Szukam testuję jednak nie mogę uzyskać w 100% poprawnego wyniku.

Proszę chociaż o wskazówkę w czym może tkwić problem... co_jest.gif

Nikt nie pomoże? Chociaż jakaś wskazóweczka, we wszystkich przykładach w sieci jest taki schemat wyświetlania, nie wiem tylko czemu np. pierwsza gałąź przechodzi 2 razy... co_jest.gif
nospor
No bo zbędnie przekazujesz $tree_str przez co za każdym razem funkcja wchodzi z wypełniomym już $tree_str i on się ciągle powiększa o stare dane

  1. function generate_menu_tree($nodes) {
  2. if( !empty( $nodes ) ) {
  3. $tree_str = '<ul>';
  4. foreach( $nodes as $node ) {
  5. $tree_str .= '<li>';
  6. $tree_str .= strtolower($node['name']);
  7. if( !empty($node['child_nodes'])) {
  8. $tree_str .= $this->generate_menu_tree($node['child_nodes']);
  9. }
  10. $tree_str .= '</li>';
  11. }
  12. $tree_str .= '</ul>';
  13. }
  14. return $tree_str;
  15. }
  16.  
  17. $tree_html = $this->generate_menu_tree($test_array);

I już smile.gif
iwosz
Geniusz. :]

Nie wiem co się stało że tego nie zauważyłem, sam się teraz smieje... sciana.gif brzydal.gif

No dobra teraz oczywiście działa tak jak trzeba... wybaczcie za zawracanie gitary worriedsmiley.gif
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.