Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Funkcja rekurencyjna tworząca tablice wielopoziomową.
Forum PHP.pl > Forum > Przedszkole
Durkane
Witam.
Otóż mam taki problem, chce zrobić kod, który będzie tworzył tablicę np. damy liczbę 2 i zrobi tablicę takiego rodzaju

1
...1
...2

2
...1
...2
itd itd jak podamy inne liczby. TO się rozszerzy o więcej poziomów.

Mam taki kod :
  1. <?php
  2.  
  3. $Number = 4;
  4.  
  5. function tablica($Number, $Index = '')
  6. {
  7. foreach ($Number as $key=>$value)
  8. {
  9. if(is_array($value))
  10. {
  11. tablica($value, $index .= $key);
  12. $index = substr($index, 0, -1);
  13. }
  14. else
  15. {
  16. echo $index.$key.':'.$value.'<br />';
  17. }
  18. }
  19. }
  20.  
  21. tablica($Number, $Index='');
  22. ?>


Przejrzałem chyba z ~20 tematów o funkcji rekurencyjnej i tablicy, ale żaden mi nie rozjaśnił nic w głowie : / Czy jest ktoś kto może to wyjaśnić w miarę sensownie żebym załapał jak mam napisać to ? Z góry dziękuję smile.gif I pytanie co piszę źle w foreach, że za każdym razem jak tego użyję to wyskakuje mi Warning: Invalid argument supplied for foreach() in C:\WebServ\httpd-users\cos\tablica wielopoziomowa.php on line questionmark.gif Bo według mnie są dobre argumenty podane.
kapslokk
Rozpisz ta tablice z poziomami dla wiekszej liczby np 4, bo nie czaje co chcesz osiagnac. A foreach Ci wywala blad, bo nie przekazujesz do niego tablicy, tylko liczbe 4 w pierwszym wywolaniu.
Durkane
Właśnie chce zrobić, że przez tą liczbę 4 tworzą się 4 poziomy tablicy.


W skrócie to dla 4 masz 4 liczby dla każdej z tej 4 dodaje 4 liczby i do kolejnej 4 dodaje kolejne 4 itd biggrin.gif

Może tak dajemy do tablicy 3 liczby (1,2,3). Dla tych 3 liczb dodajemy (dla każdej osobno) kolejne 3 liczby (1,2,3) i dla tych 3 kolejne 3.

Wtedy mamy :
1
..1
......1
......2
......3
..2
......1
......2
......3
..3
......1
......2
......3
2
..1
......1
......2
......3
..2
......1
......2
......3
..3
......1
......2
......3
3
..1
......1
......2
......3
..2
......1
......2
......3
..3
......1
......2
......3
kapslokk
Ok, mamy klucze. Wartosci maja byc jakies konkretne? W ogole po co cos takiego? W jakims konkretnym celu czy po prostu wymysliles sobie taki przyklad zeby pocwiczyc rekurencje?

Bah nie ważne, Juz wiem co ma byc wartoscia biggrin.gif Nie zaczailem.
Durkane
Jest to zadanie od znajomego programisty, aby poćwiczyć funkcje rekurencyjne smile.gif Ogólnie powiedział, że wartość ze zmiennej może być wprowadzana. Czyli byle jakie wartości.
A i powiedział żeby później użyć var_dump do wypisania tego tongue.gif
kapslokk
W takim razie zrob tak:
funkcja niech przyjmuje dwa parametry. jeden to ile poziomow zagniezdzen ma robic a drugi to na ktorym jestes aktualnie. Potem w forze od 0 do ilosci zagniezdzen-1 do tablicy przypisujesz

jesli poziom > 0 wynik dzialania tej funkcji dla poziomu mniejszego o 1 a jezeli == 0 to wartosc licznika z fora i. I tyle.

Mniej wiecej tak smile.gif

Jak sobie nie będziesz radził to obczaj tutaj:
  1. function test($level, $max = null)
  2. {
  3. if ($max == null) {
  4. $max = $level;
  5. }
  6. $array = array();
  7. for ($i = 0; $i < $max; $i++) {
  8. if ($level > 0) {
  9. $array[$i] = test($level - 1,$max);
  10. }else{
  11. $array[$i] = $i;
  12. }
  13. }
  14. return $array;
  15. }
Durkane
Jestem po nocnej zmianie to ciężko z myśleniem,ale już powoli łapie co miałeś na myśli biggrin.gif mam nadzieję, że nie skorzystam z tego co napisałeśtongue.gif

Bardzo dziękuję za pomoc !:P Udało się to wykonać smile.gif A jeszcze mam pytanie, czy da się wyświetlać to w kolumnie tak jak ja rozpisywałem ? Czy tylko w taki sposób array(2) { [0]=> array(2) { [0]=> array(2) { [0]=> int(0) [1]=> int(1) } [1]=> array(2) { [0]=> int(0) [1]=> int(1) } } [1]=> array(2) { [0]=> array(2) { [0]=> int(0) [1]=> int(1) } [1]=> array(2) { [0]=> int(0) [1]=> int(1) } } } questionmark.gif
kapslokk
xdebug ladnie wyswietla dumpy w kolumnach smile.gif Mozesz zainstalowac smile.gif
Durkane
Hm... zrobiłem według poradnika instalacji i nic nie zrobiło się z wyświetlaniem tongue.gif
kapslokk
W takim razie zrobiłeś coś nie tak smile.gif Jaki masz system i co to za poradnik?
Durkane
Instalacja XDebug ten poradnik.
Windows 8 64 bit. Używam WebServ jak coś.
kapslokk
Na pewno podałeś dobre ścieżki? Logi coś pokazują?
Durkane
Failed loading c:/WebServ/php/ext/php_xdebug-2.3.3-5.4-vc9-nts-x86_64.dll

Jedyny problem to taki, że nie posiadam takiej linijki w php.ini ";extension=php_zip.dll" : /
Więc dałem tak
extension=php_xsl.dll
zend_extension = "c:/WebServ/php/ext/php_xdebug-2.3.3-5.4-vc9-nts-x86_64.dll"

Dobra zmieniłem z małego c na duże C i nie ma już tego Failed loading, ale nadal nic mi się nie zmieniło w wyświetlaniu tablicy.
kapslokk
Jeżeli plik z biblioteką jest w tym katalogu, to nie mam pomysłu. Ewentualnie spróbuj użyć starszej wersji. Albo linuxa biggrin.gif
Durkane
A trzeba mieć do tego zenda zainstalowanego ? Bo ja nie mam go tongue.gif To jakoś się włącza czy samo po podaniu ścieżki już działa i zmienia wszystko?

LOG

Apache server shutdown initiated...
Child 7052: Child process is running
[Fri Aug 07 12:20:05 2015] [notice] Child 7052: Acquired the start mutex.
[Fri Aug 07 12:20:05 2015] [notice] Child 7052: Starting 64 worker threads.
[Fri Aug 07 12:20:05 2015] [notice] Child 7052: Starting thread to listen on port 80.
[Fri Aug 07 12:20:05 2015] [notice] Child 7052: Starting thread to listen on port 80.
[Fri Aug 07 12:22:31 2015] [notice] Parent: Received shutdown signal -- Shutting down the server.
[Fri Aug 07 12:22:31 2015] [notice] Child 7052: Exit event signaled. Child process is ending.
[Fri Aug 07 12:22:32 2015] [notice] Child 7052: Released the start mutex
[Fri Aug 07 12:22:33 2015] [notice] Child 7052: All worker threads have exited.
[Fri Aug 07 12:22:33 2015] [notice] Child 7052: Child process is exiting
[Fri Aug 07 12:22:33 2015] [notice] Parent: Child process exited successfully.
[Fri Aug 07 12:22:33 2015] [notice] Apache/2.2.22 (Win32) PHP/5.4.10 configured -- resuming normal operations
[Fri Aug 07 12:22:33 2015] [notice] Server built: Feb 13 2012 12:13:59
[Fri Aug 07 12:22:33 2015] [notice] Parent: Created child process 2708
[Fri Aug 07 12:22:33 2015] [notice] Child 2708: Child process is running
[Fri Aug 07 12:22:33 2015] [notice] Child 2708: Acquired the start mutex.
[Fri Aug 07 12:22:33 2015] [notice] Child 2708: Starting 64 worker threads.
[Fri Aug 07 12:22:33 2015] [notice] Child 2708: Starting thread to listen on port 80.
[Fri Aug 07 12:22:33 2015] [notice] Child 2708: Starting thread to listen on port 80.
kapslokk
Samo dodanie modułu do php.ini powinno wystarczyć. Nic więcej nie jest potrzebne - chyba biggrin.gif.
Durkane
Dobra musi zostać tak jak jest bo nic, nie pomaga na tego xDebuga smile.gif Dzięki wielkie za pomoc.
redeemer
Cytat(Durkane @ 7.08.2015, 11:37:04 ) *
A jeszcze mam pytanie, czy da się wyświetlać to w kolumnie tak jak ja rozpisywałem ? Czy tylko w taki sposób array(2) { [0]=> array(2) { [0]=> array(2) { [0]=> int(0) [1]=> int(1) } [1]=> array(2) { [0]=> int(0) [1]=> int(1) } } [1]=> array(2) { [0]=> array(2) { [0]=> int(0) [1]=> int(1) } [1]=> array(2) { [0]=> int(0) [1]=> int(1) } } } questionmark.gif
Przeglądarki nie renderują m.in. znaków nowej linii w HTML, dlatego jak spojrzysz w źródło strony zobaczysz to lepiej sformatowane.
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.