Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] return z funkcji rekurencyjnej
Forum PHP.pl > Forum > PHP
babejsza
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?
SongoQ
WybierzDate($nowaData, $wynik);

Jesli to ma byc rekurencja to chyba gdzies to trzeba przypisac.
babejsza
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ść smile.gif.
misiek172
WybierzDate($nowaData, $wynik);

właśnie musis użyć chociarz $this ...
babejsza
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.
misiek172
chłopie przecierz nie można odwoływać się w ten sposób ze wstawisz funkcje w tej funkcji bez przypisania
babejsza
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ą.
SongoQ
@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.
babejsza
Jasne, ale gafa smile.gif. Zły dzień mnie zdecydowanie nie usprawiedliwia, ale niestety się takie zdarzają.

Dzięki wielkie za pomoc.
heaven
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
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.