Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Generowanie menu pętla w pętli Uproszczenie kodu
Forum PHP.pl > Forum > PHP
arecki_24
Witam.
Jak uprościć kod jeżeli posiadam zmienną ile leveli powinno mieć menu $level_ile
Poniżej kod:
  1.  
  2. <?php
  3. $arr_lev[1] = Array (
  4. Array ( 'id' => 1, 'par' => 0, 'lev' => 1, 'name' => '01' ),
  5. Array ( 'id' => 2, 'par' => 0, 'lev' => 1, 'name' => '02' ),
  6. Array ( 'id' => 3, 'par' => 0, 'lev' => 1, 'name' => '03' ),
  7. Array ( 'id' => 4, 'par' => 0, 'lev' => 1, 'name' => '04' )
  8. );
  9.  
  10.  
  11. $arr_lev[2] = Array (
  12. Array ( 'id' => 5, 'par' => 2, 'lev' => 2, 'name' => 'A1' ),
  13. Array ( 'id' => 6, 'par' => 2, 'lev' => 2, 'name' => 'A2' ),
  14. Array ( 'id' => 7, 'par' => 3, 'lev' => 2, 'name' => 'A3' ),
  15. Array ( 'id' => 8, 'par' => 4, 'lev' => 2, 'name' => 'A4' )
  16. );
  17.  
  18. $arr_lev[3] = Array (
  19. Array ( 'id' => 9, 'par' => 5, 'lev' => 3, 'name' => 'B1' ),
  20. Array ( 'id' => 10, 'par' => 5, 'lev' => 3, 'name' => 'B2' ),
  21. Array ( 'id' => 11, 'par' => 6, 'lev' => 3, 'name' => 'B3' ),
  22. Array ( 'id' => 12, 'par' => 7, 'lev' => 3, 'name' => 'B4' )
  23. );
  24.  
  25. for($i=1;$i<=999;$i++)
  26. {
  27. if($arr_lev[$i] == null) {$level_ile=$i-1; print('level_ile='.$level_ile.'<br/><br/>');break;}
  28. }
  29.  
  30.  
  31.  
  32. $tab='&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
  33.  
  34. for($i1=0;$i1<=sizeof($arr_lev[1]);$i1++){
  35. print($arr_lev[1][$i1][name].'<br/>');
  36.  
  37. for($i2=0;$i2<=sizeof($arr_lev[2]);$i2++){
  38. if($arr_lev[1][$i1][id]==$arr_lev[2][$i2][par]){
  39. print($tab.$arr_lev[2][$i2][name].'<br/>');
  40.  
  41. for($i3=0;$i3<=sizeof($arr_lev[3]);$i3++){
  42. if($arr_lev[2][$i2][id]==$arr_lev[3][$i3][par]){
  43. print($tab.$tab.$arr_lev[3][$i3][name].'<br/>');
  44.  
  45. for($i4=0;$i4<=sizeof($arr_lev[4]);$i4++){
  46. if($arr_lev[3][$i3][id]==$arr_lev[4][$i4][par]) {
  47. print($tab.$tab.$tab.$arr_lev[4][$i4][name].'<br/>');
  48. }
  49. }
  50. }
  51. }
  52. }
  53. }
  54. print('<br/>');
  55.  
  56. }
  57. ?>
  58.  
Daiquiri
A nie możesz po prostu napisać w funkcji pętli, która będzie się zagłębiała na zadaną głębokość, a potem w jej wnętrzu wywoływać ją na nowo (jeżeli trzeba zejść głębiej)? Chyba, że nie rozumiem co chcesz osiągnąć smile.gif
posiadacz
Witam,
rozwiązanie drzewek którego używam polega na tworzeniu ciągu - ścieżki, coś na kształt breadcrumb.

Załóżmy że chcemy otrzymać coś takiego:
Kat 1
Podkat 1
Podkat 2

Kat 2
Podkat 3


  1. array('kat 1', '0000Kat 1'),
  2. array('Podkat 1', '0000Kat 10000Podkat 1'),
  3. array('Podkat 2', '0000Kat 10000Podkat 10000Podkat 2'),
  4. array('Kat 3', '0000Kat 3'),
  5. array('Podkat 3', '0000Kat 30000Podkat 3'),
  6. )


Teraz wystarczy posortować po drugim elemencie i mamy gotowe drzewo.
Jeśli nie wszystko jest jasne postaram sie wytłumaczyc na elemencie Podkat 1
nazwa - Podkat 1
ciąg-ścieżka - 00000000Podkat 1
0000Kat 1 - ciąg z kategorii nadrzędnej
0000Podkat 1 - ciąg aktualnej kategorii
cyframi 0000 można ustawiać kolejność od 0 do 9999 - daje to możliwość 1000 kategorii w jednej gałęzi.

Powodzenia
arecki_24
Zastosowałem funkcje tylko mam problem z zapetleniem funkcji w funkcji. Zmienne przygotowane ale brak wiedzy odnośnie zapętlenia funkcji. Proszę o pomoc smile.gif
  1. <?php
  2.  
  3. $arr_lev[1] = Array (
  4. Array ( 'id' => 1, 'par' => 0, 'lev' => 1, 'name' => '01' ),
  5. Array ( 'id' => 2, 'par' => 0, 'lev' => 1, 'name' => '02' ),
  6. Array ( 'id' => 3, 'par' => 0, 'lev' => 1, 'name' => '03' ),
  7. Array ( 'id' => 4, 'par' => 0, 'lev' => 1, 'name' => '04' ));
  8.  
  9. $arr_lev[2] = Array (
  10. Array ( 'id' => 5, 'par' => 2, 'lev' => 2, 'name' => 'A1' ),
  11. Array ( 'id' => 6, 'par' => 2, 'lev' => 2, 'name' => 'A2' ),
  12. Array ( 'id' => 7, 'par' => 3, 'lev' => 2, 'name' => 'A3' ),
  13. Array ( 'id' => 8, 'par' => 4, 'lev' => 2, 'name' => 'A4' ) );
  14.  
  15. $arr_lev[3] = Array (
  16. Array ( 'id' => 9, 'par' => 5, 'lev' => 3, 'name' => 'B1' ),
  17. Array ( 'id' => 10, 'par' => 5, 'lev' => 3, 'name' => 'B2' ),
  18. Array ( 'id' => 11, 'par' => 6, 'lev' => 3, 'name' => 'B3' ),
  19. Array ( 'id' => 12, 'par' => 7, 'lev' => 3, 'name' => 'B4' ));
  20.  
  21. for($i=1;$i<=999;$i++){
  22. if($arr_lev[$i] == null){
  23. $level_ile=$i-1;
  24. print('level_ile='.$level_ile.'<br/><br/>');
  25. break;
  26. }
  27. }
  28.  
  29.  
  30. function loop($arre,$parent_arre,$ktory,$tab,$level_ile)
  31. {
  32. foreach($arre[$ktory] as $item) {
  33. print($item[name].'<br>');
  34. $tmp[$ktory]=$item[id];
  35.  
  36. foreach($arre[$ktory+1] as $item) {
  37. if($tmp[$ktory]==$item[par]) {$tmp[$ktory+1]=$item[id]; print($tab.$item[name].'<br>');
  38. foreach($arre[$ktory+2] as $item) {
  39. if($tmp[$ktory+1]==$item[par]) {$tmp[$ktory+2]=$item[id]; print($tab.$tab.$item[name].'<br>');
  40. foreach($arre[$ktory+3] as $item) {
  41. if($tmp[$ktory+1]==$item[par]) {$tmp[$ktory+3]=$item[id]; print($tab.$tab.$tab.$item[name].'<br>');
  42. }
  43. }
  44.  
  45. }
  46. }
  47. }
  48. }
  49. }
  50. }
  51.  
  52. $tab='&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
  53. $ile=1;
  54. loop($arr_lev,$item,$ile,$tab,$level_ile);
  55.  
  56. ?>
  57.  
kto$
a nie prościej patrząc na kod, będzie ci wykorzystac rekurencje funkcji loop z warunkiem czy nic nie znajduję się głębiej? cos w stylu:
  1. funkcja loop(...){
  2. dla kazdego elementu tablicy
  3. if (is_array(element_tablicy))
  4. wykonajj funkcje loop
  5. else
  6. wyswietl element
  7.  
arecki_24
Dzięki wszystkim za naprowadzenie mnie na rozwiązanie w szczegolności $ktos.
Ostatecznie wyszło mi cos takiego:

  1. <?php
  2.  
  3. $arr_lev[1] = Array (
  4. Array ( 'id' => 1, 'par' => 0, 'lev' => 1, 'name' => '01' ),
  5. Array ( 'id' => 2, 'par' => 0, 'lev' => 1, 'name' => '02' ),
  6. Array ( 'id' => 3, 'par' => 0, 'lev' => 1, 'name' => '03' ),
  7. Array ( 'id' => 4, 'par' => 0, 'lev' => 1, 'name' => '04' ));
  8.  
  9. $arr_lev[2] = Array (
  10. Array ( 'id' => 5, 'par' => 2, 'lev' => 2, 'name' => 'A1' ),
  11. Array ( 'id' => 6, 'par' => 2, 'lev' => 2, 'name' => 'A2' ),
  12. Array ( 'id' => 7, 'par' => 3, 'lev' => 2, 'name' => 'A3' ),
  13. Array ( 'id' => 8, 'par' => 4, 'lev' => 2, 'name' => 'A4' ) );
  14.  
  15. $arr_lev[3] = Array (
  16. Array ( 'id' => 9, 'par' => 5, 'lev' => 3, 'name' => 'B1' ),
  17. Array ( 'id' => 10, 'par' => 5, 'lev' => 3, 'name' => 'B2' ),
  18. Array ( 'id' => 11, 'par' => 6, 'lev' => 3, 'name' => 'B3' ),
  19. Array ( 'id' => 12, 'par' => 7, 'lev' => 3, 'name' => 'B4' ));
  20.  
  21.  
  22. function loop_in($arre,$tmp,$ktory){
  23. $space='&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
  24. foreach($arre[$ktory+1] as $item) {
  25. if($tmp[$ktory]==$item[par] || $item[par]==0) {
  26. for($i=1;$i<$item[lev];$i++) {print($space);}
  27. $tmp[$ktory+1]=$item[id];
  28. print($item[name].'<br>');
  29. loop_in($arre,$tmp,$ktory+1);
  30. }
  31. }
  32. }
  33.  
  34.  
  35. loop_in($arr_lev,null,0);
  36.  
  37. ?>
  38.  
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.