function wylosuj($ilosc,$tab,$licznik=1) { $last=count($tab)-$licznik++; $tab=zmien(rand(0,$last),$tab,$last); if($ilosc==0) return array_splice($tab,0-$licznik-1,3); else(--$ilosc,$tab,$licznik); }[/code]
Dla wywołania:
[code=php]$arr=array("asd","wqt","xcvb","te","c","bcvx","y","r","sdfg","sdf");print_r(wylosuj(4,$arr));
Zamieniając return na print_r, wyświetla mi wynik. Natomiast return nie przekazuje wyniku (tablicy) do print_r wywołania :)
Możesz jeszcze udostępnić ciało funkcji zmien()?
hmmm…
jakoś nie chce mi się tego specjalnie rozkminiać, tak na szybko po else też return :roll:
Dużo to raczej nie wniesie
function zmien($i,$t,$o)
Fakt, mało wniosło, ale pozwoliło mi to wykonać doświadczenie samemu (jakoś tak lepiej się myśli) i po chwili namysłu … już wiem o co chodzi
if($ilosc==0) return array_splice($tab,0-$licznik-1,3); Dla $ilość równego 0 zwracasz wynik funkcji array_splice, w innym wypadku wykonujesz funkcję, ale [u]nie[/u] zwracasz jej wyniku.
Jedno return więcej ...
[code=php]if($ilosc==0) return array_splice($tab,0-$licznik-1,3);
i śmiga.
Edit: aaaaa, adpawl już to napisał eh. Nie spojrzałem wcześniej jego post. Spojrzałem tylko na odpowiedź "@up ..." i jakoś tak założyłem, że nie przynosi rozwiązania.
Toć to jest jeden wielki fail. Przecież zwracam wartość dopiero po wyczerpaniu się licznika. Dziwne Dzięki wam obu. Wie ktoś dlaczego jest tak, a nie inaczej ?
//@up edit, przynosi rozwiązanie, to ja błędnie założyłem że ten return go nie przynosi
Ojoj, ostatnio jak tłumaczyłem rekurencje komuś nic z tego dobrego nie wynikło.
Trzeba próbować. Hm, to może prezentacja na obrazku. http://i.imgur.com/HSwsm.png
Co o wyżej wymienionej informacji myślisz, mam jakiś sukces pedagogiczny?
Pomieszało mi się to trochę, obrazek był pomocny
…trochę mnie nie było, ale kolega widzę wyjaśnił i to obrazowo jak to działa
No nie ma to większego sensu, fakt.
Na dobrą sprawę, to nie wiem co właściwie chcesz osiągnąć.
Mogę się tylko domyślać …może chodziło np. o if($ilosc <= $last) zamiast if($ilosc==0) #-o
Ponieważ oczywista oczywistością jest, że jak dasz if($ilosc==0), to wynik zwróci dopiero po spełnieniu tego ifa.
Właśnie tak to miał robić, ale trochę namieszałem, szczególnie z ilość i licznik
$ilosc-ile do konca
$tab-tablica
$licznik-ostatni element ktory zamieniamy (ilosc przejsc)
$last=count($tab)-$licznik++; //liczymy element zamieniany (ostatni, jeszcze nie wylosowany)
$tab=zmien(rand(0,$last),$tab,$last);//zamieniamy losowy jeszcze nie zamieniony z zamienianym
if($ilosc==0)//jesli mamy tyle zamienionych co chcemy konczymy
return array_splice($tab,0-$licznik-1,3);
else//w innym wypadku losujemy jeszcze jedną, zmniejszając przed tym ilość do końca
wylosuj(–$ilosc,$tab,$licznik);
Tak więc ma zwracać po spełnieniu if’a, ale zapomniałem że funkcja zwraca się do tyłu, nigdy wcześniej nie robiłem tak jak mam teraz (wcześniej miewałem negację do kolejnego wywołania, a potem return)