Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php] return z funkcji rekurencyjnej
babejsza
post
Post #1





Grupa: Zarejestrowani
Postów: 407
Pomógł: 1
Dołączył: 4.03.2003
Skąd: warszawa

Ostrzeżenie: (0%)
-----


Witam,

mam kiepski dzień i chyba mnie zamroczyło. Prosta funkcja, a zwraca głupoty (w sumie to ona zwraca dobrze, tylko ja jakąś głupotę napisałem).

  1. <?php
  2. $wynik = array('2007-01-01', '2007-04-08', '2007-04-09', '2007-05-01', '2007-05-03', '2007-05-28', '2007-06-07', '2007-08-15', '2007-11-01', '2007-11-11', '2007-12-25', '2007-12-26');
  3. $data = '2007-12-26';
  4.  
  5. function WybierzDate($data, $wynik)
  6. {
  7. while ($value = current($wynik)) 
  8. {
  9. if ($value == $data) 
  10. {
  11. $key = key($wynik);
  12. $wynik = array_slice($wynik, 0, $key);
  13. $explode = explode('-', $data);
  14. $nowaData = date('Y-m-d', mktime(0,0,0,$explode[1], $explode[2]-1, $explode[0]));
  15. WybierzDate($nowaData, $wynik);
  16. }
  17. else return $wynik;
  18. next($wynik);
  19. }
  20. }
  21.  
  22. print_r($wynik);
  23. print_r(WybierzDate($data, $wynik));
  24. ?>


Czyli jak widać mam tablicę z dniami wolnymi od pracy. To co chcę zrobić to sprawdzić czy data ze zmiennej znajduje się w tablicy, a jeżeli tak to skrócenie jej (tablicy) do daty wcześniejszej. Potem jeszcze sprawdzenie rekurencją czy data dnia poprzedniego nie znajduje się w tej nowej tablicy. Tyle, że zwraca mi ciągle tą samą nie skróconą tablicę pomimo tego, że teoretycznie powyższy przykład powinien dać mi wynik bez dat grudniowych.

Dlaczego tak się dzieje? Co robię nie tak?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
SongoQ
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


WybierzDate($nowaData, $wynik);

Jesli to ma byc rekurencja to chyba gdzies to trzeba przypisac.
Go to the top of the page
+Quote Post
babejsza
post
Post #3





Grupa: Zarejestrowani
Postów: 407
Pomógł: 1
Dołączył: 4.03.2003
Skąd: warszawa

Ostrzeżenie: (0%)
-----


Nie do końca rozumiem co masz na myśli przez przypisać.
Funkcja sprawdza poprzez pętlę czy data występuje w tablicy, jeśli tak to wykonuje operacje i "zgłasza się" ponownie do wykonania z nowymi danymi. Jeśli nie to zwraca wartość w postaci tablicy. Nie rozumiem co mam gdzie przypisać, ale jak już mówiłem mam zły dzień i proszę w związku z tym o wyrozumiałość (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) .
Go to the top of the page
+Quote Post
misiek172
post
Post #4





Grupa: Zarejestrowani
Postów: 656
Pomógł: 3
Dołączył: 26.10.2005
Skąd: Częstochowa

Ostrzeżenie: (0%)
-----


WybierzDate($nowaData, $wynik);

właśnie musis użyć chociarz $this ...
Go to the top of the page
+Quote Post
babejsza
post
Post #5





Grupa: Zarejestrowani
Postów: 407
Pomógł: 1
Dołączył: 4.03.2003
Skąd: warszawa

Ostrzeżenie: (0%)
-----


To nie jest klasa tylko funkcja. Prosta jak budowa cepa. Coś takiego jak chociażby z malnual'a

  1. <?php
  2. function rekurencja($a)
  3. {
  4.  if ($a < 20) {
  5.  echo "$an";
  6.  rekurencja($a + 1);
  7.  }
  8. }
  9. ?>


Tylko bez 'echo' a z return'em ostatniej wygenerowanej tablicy.
Go to the top of the page
+Quote Post
misiek172
post
Post #6





Grupa: Zarejestrowani
Postów: 656
Pomógł: 3
Dołączył: 26.10.2005
Skąd: Częstochowa

Ostrzeżenie: (0%)
-----


chłopie przecierz nie można odwoływać się w ten sposób ze wstawisz funkcje w tej funkcji bez przypisania

Ten post edytował misiek172 1.03.2007, 14:25:01
Go to the top of the page
+Quote Post
babejsza
post
Post #7





Grupa: Zarejestrowani
Postów: 407
Pomógł: 1
Dołączył: 4.03.2003
Skąd: warszawa

Ostrzeżenie: (0%)
-----


No właśnie zrobiłem to we wczesniejszym poście. Wywołanie jej zwróci ładny ciąg liczb z 19 włącznie. A ja bym teraz chciał za pomocą return zwrócić tylko wartość maksymalną.
Go to the top of the page
+Quote Post
SongoQ
post
Post #8





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


@babejsza Zly dzien Cie nie usprawiedliwia. Juz Ci powiedzialem co masz zle. Przeczytaj sobie bo chyba pojecia mylisz http://pl.wikipedia.org/wiki/Rekursja a szczegolnie http://pl.wikipedia.org/wiki/Symbol_Newtona na dole masz jak uzyc w pascalu wiec co za problem przelozyc na php.

Kolejne takiego typu odpowidz do postu bedzie nagrodzona ostrzezeniem.
Go to the top of the page
+Quote Post
babejsza
post
Post #9





Grupa: Zarejestrowani
Postów: 407
Pomógł: 1
Dołączył: 4.03.2003
Skąd: warszawa

Ostrzeżenie: (0%)
-----


Jasne, ale gafa (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) . Zły dzień mnie zdecydowanie nie usprawiedliwia, ale niestety się takie zdarzają.

Dzięki wielkie za pomoc.
Go to the top of the page
+Quote Post
heaven
post
Post #10





Grupa: Nieautoryzowani
Postów: 92
Pomógł: 15
Dołączył: 21.10.2006

Ostrzeżenie: (0%)
-----


a czy problem nie tkwi w warunku if??
  1. <?php
  2. if ($value == $data) 
  3.  {
  4.  $key = key($wynik);
  5.  $wynik = array_slice($wynik, 0, $key);
  6.  $explode = explode('-', $data);
  7.  $nowaData = date('Y-m-d', mktime(0,0,0,$explode[1], $explode[2]-1, $explode[0]));
  8.  WybierzDate($nowaData, $wynik);
  9.  }
  10.  else return $wynik;
  11. ?>

przy pierwszej petli warunek masz niespelniny ($data = '2007-12-26' a $value jest pierwszym elementem czyli '2007-01-01') wiec wykonuje sie else czyli return $wynik; zadna rekurencja nie zachodzi. przy okazji rekurencje tez masz chyba nie tak

Ten post edytował heaven 1.03.2007, 17:14:25
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 01:28