Print_r wyświetla tablicę, ale return jej nie przekazuje


(Drobok) #1
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 :)

(Copycona) #2

Możesz jeszcze udostępnić ciało funkcji zmien()?


(adpawl) #3

hmmm...

jakoś nie chce mi się tego specjalnie rozkminiać, tak na szybko po else też return :roll:


(Drobok) #4

Dużo to raczej nie wniesie :slight_smile:

function zmien($i,$t,$o)

(Copycona) #5

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 :slight_smile:

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.

(Drobok) #6

Toć to jest jeden wielki fail. Przecież zwracam wartość dopiero po wyczerpaniu się licznika. Dziwne :slight_smile: 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 :stuck_out_tongue:


(Copycona) #7

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? :smiley:


(Drobok) #8

Pomieszało mi się to trochę, obrazek był pomocny :slight_smile:


(adpawl) #9

...trochę mnie nie było, ale kolega widzę wyjaśnił i to obrazowo jak to działa :smiley:

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.


(Drobok) #10

Właśnie tak to miał robić, ale trochę namieszałem, szczególnie z ilość i licznik :slight_smile:

$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)