Minulla on eräs funktio, joka käsittelee erilaisia numerosarjoja; Kutsun sitä aina rekursiivisesti funktion lopussa kunnes numerosarja on ratkennut, mutta kun yritän lopulta palauttaa numerosarjaa taulukossa, se ei pidä sisällään mitään.. Tässä ongelman ydin:
<?php function rekursio($table, $map) { . . Tehdään kaikkea jännää $mapille . . if(onko_valmis($map)) { // Jos on valmis tehdään näin return $map; // Palauttaa tyhjän, mutta jos laitan ennen return komentoa print_r($map); tulee valtava määrä valmiiksi käsiteltyä tietoa ihan oikein, mutta returnin yhteydessä kaikki tuntuu katoavan kuin tuhka tuuleen } else { rekursio($table, $map); } } ?>
Eli siis mikä mättää?
Väsyneen pään logiikalla näin:
. . . } else { $map = rekursio($table, $map); } . . .
Muoks!
Tai ehkä ei sittenkään. En kylläkään muista, pystyikö PHP:ssa määrittelemään jotenkin voiko funktiolle syötetyn muuttujan tyyppiä vaihtamaan, siis että tehdäänkö siitä kopio (by value) vai onko muuttuja kopioimaton (by reference).
Olen koittanut tota jo.. ei auta :(
Hmm, olisiko sitten jotakin niin perverssiä kuin return rekursio($table, $map); ...
Tämä on tätä kun pitäisi miettiä alusta asti tuo mitä tuossa tapahtuu missä järjestyksessä ja missä vaiheessa logiikka ei enää pelaakaan.
Aivan =) oon miettinyt pään puhki, mutta se kummastuttaa, että jos tulostan taulukon näin:
print_r($map); // tulee oikeat tiedot juuri niinkuin haluan
return $map; // tiedot ovat kadonneet ??!?!??! miten on mahdollista
<?php function rekursio($table, $map) { $arr = array(); if (ehto) $arr = array_merge($arr, rekursio(parametri1, parametri2)); return $arr; } } ?>
Ja parametri1 & parametri2 eivät voi olla samat kuin $table ja $map, koska muuten rekursio pyörii ikuisesti ellet sitten käytä jotain globaalia muuttujaa ja käytä sitä ehtolauseessa.
Jos muuttujassa $map on oikeat tiedot ennen return-lausetta, niin kyllä funktiokin palauttaa oikeat tiedot.
Voisitko vähän tarkemmin kertoa, mitä rekursiivisen funktion on tarkoitus tehdä?
Ei kyllä lähe toimimaan tollakaan :<
En vaan keksi mikä tossa on.. kaikki avunannot otetaan avosylin vastaan =)
Mikä on tuon muuttujan $onko_valmis määritelmä? Millä ehdolla rekursiivista funktiota kutsutaan uudelleen?
Varma (mutta työläs) tapa selvittää ongelma on lisätä funktioon echo-lauseita, joista voi seurata ohjelman kulkua ja muuttujien arvoja. Kun on riittävän kärsivällinen, niin vika kyllä paljastuu ohjelman tulostusta tutkimalla. Virheen etsiminen helpottuu, jos funktioon lisää muuttujan $kerros, joka ilmoittaa, kuinka mones sisäkkäinen funktion kutsu on kyseessä.
Olen kokeillut ja testannut funktion toimivaksi juuri echoja käyttämällä sekä kerroksia tutkimalla, kaikki pelaa funktiossa niinkuin pitää, ei mitään moitteita, mutta jonnekkin se tieto katoaa kun returnaa.. funktion sisällä tiedon tulostaminen onnistuu vallan mainiosti, mutta kun yrittää returnilla laittaa tietoa eteenpäin niin se vain katoaa :S
Aihe on jo aika vanha, joten et voi enää vastata siihen.