Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Rekurzivni funkce pro vytvoreni rodokmenu

Aktivity
Avatar
Tomas Macek
Člen
Avatar
Tomas Macek:16.10.2018 22:58

Ahoj, potrebuju pomoc s jednou rekurzivni funkci. V databazi mam zaznamy lidi, vcetne rodicu. Vypada to nejak takto:

ID;CISLO;JMENO;MATKA;OTEC
1;rc001;Jmeno1;rc005;rc140
2;rc002;Jmeno2;rc001;rc016
3;rc005;Jmeno3;rc036;rc072
......

Zkousel jsem vytvoril rekurzivni funkci, ktera by prochazela od zadaneho cloveka smerem do minulosti. Funkce by byla omezena na maximalne 15 generaci zpet a vystupem by melo byt vicerozmerne pole:

$out[0][0]  // clovek na ktereho jsem se ptal
$out[1][0]  // matka prvniho cloveka
$out[1][1] // otec prvniho cloveka
$out[2][0] // prababicka cloveka z matciny strany
$out[2][1] // pradeda cloveka z matciny strany
$out[2][2] // prababicka cloveka z otcovy strany
$out[2][3] // pradeda cloveka z otcovy strany

... v dalsi generaci by uz bylo 8 praprarodicu, v dalsi 16,...

Problem je ze nekde v databazi nejsou odkazy na rodice nebo jsou nesmyslne. Proto jsem si do databaze udelal "falesny" zaznam, ktery ma jako jmeno hodnotu nula a u rodicu take. Pokud se mi v nektere vetvi objevi, tak v jeho predchozich generacich budou uz rodice take s nulou (to mi pomuze ze se vzdy vytvori kompletni rodokmen i kdyz v nem bude treba polovina zaznamu nulovych). Vedlejsim efektem je tedy ze, mi vzdy vznikne vzdy rodokmen o 15 generacich, ale z nej bych si dokazal odmazat generace kde jsou uz jen zaznamy s nulama.

Zkusil jsem:
Problem je v te rekurzivni funkci, ktera mi "zdvojuje" pole vysledku. Nejak nejsem schopen to poradne vymyslet abych dostal vysledek ktery chci. pouzite funkce:

function detail($cislo) {
     $d = mysql_query("select * from kniha where cislo = '$cislo'");
     if(mysql_num_rows($d) == 1) {
          $db = mysql_fetch_assoc($d);
          $out["jmeno"] = $db["jmeno"];
          $out["cisloa"] = $db["cislo"];
          $out["m_cislo"] = $db["m_cislo"];
          $out["o_cislo"] = $db["o_cislo"];
     }
     else {
            $out[cislo] = "0";
            $out[m_cislo] = "0";
            $out[o_cislo] = "0";
     }
     return $out;
}


function rodokmen($cislo, $g = 0) {
    if($g < 15) {
        $p = detail($cislo);
        $out[$g][] = $p[cislo];
        $g++;
        $out[$g][] = rodokmen($p[m_cislo],$g);
        $out[$g][] = rodokmen($p[o_cislo],$g);

        $g--;

    }

    return($out);
}
 
Odpovědět
16.10.2018 22:58
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:17.10.2018 8:10

V podstate chces neco jako hledani nejkratsi cesty.
https://mlich.zam.slu.cz/js-ff/ff4b.htm

Reseni je celkem jednoduche. Napis js kod.

x = 0;
i = 0;
j = 0;
list[j] = [id, a, b, c]; j++
while (i<j && x<50)
  { hledej(list[i]); x++;} // list[j] = rodic1; j++; list[j] = rodic2; j++ // pripadne cyklus, kdyz ma rodicu vice a neni uplne jasne, ktery to byl

Hledani do pole pridava, zvysuje j, delku seznamu list.
A prvni cyklus prochazi seznam list a vola hledani, dokud nenarazi na konec seznamu list.
x je omezeni max pocetu radku. To si tam dej podminku nekde ohledne hloubky zanoreni. Tu tam vlozis jako dalsi udaj, sloupec, list[j] = [rodic2, hloubka]

Editováno 17.10.2018 8:12
 
Nahoru Odpovědět
17.10.2018 8:10
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:17.10.2018 8:20

* Napisu js kod. Nechtelo se mi to komplikovat dolarama.

A samozrejme do toho seznamu pridavas kompletni radek, pro kazdou osobu stejny pocet sloupcu.
Kdyz je id rodice null, tak osobu do seznamu nepridas, nezvetsi se velikost pole, nebude v tomto smeru dal hledat.
V prvni fazi te zajima jen seznam lidi vytahnout do tabulky.
Jeden ze sloupcu je id ditete, abys to mohl pozdeji pri vypisu propojit.

Editováno 17.10.2018 8:21
 
Nahoru Odpovědět
17.10.2018 8:20
Avatar
Tomas Macek
Člen
Avatar
Odpovídá na Peter Mlich
Tomas Macek:17.10.2018 16:17

diky za tipy - ten js se mi nelibi, ale zkusim z toho vyjit.
Mimochodem je radost potkat se s nekym kdo zna Funny fruits - jak ja tu hru na stredni uprimne nenavidel :-) ale videl jsem brachu jak parkrat dal pres tech 100ml...

 
Nahoru Odpovědět
17.10.2018 16:17
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:18.10.2018 8:27

No, znam asi 100 starych her. Kdybys chtel tipy v nejakem zanru, dej vedet.

Editováno 18.10.2018 8:27
 
Nahoru Odpovědět
18.10.2018 8:27
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.