Chci geek triko! Chci geek triko!
Extra 10 % bodů navíc a tričko zdarma při zadání kódu "TRIKO10"

Diskuze: Rekurzivni funkce pro vytvoreni rodokmenu

PHP PHP Rekurzivni funkce pro vytvoreni rodokmenu American English version English version

Aktivity (1)
Avatar
Tomas Macek
Člen
Avatar
Tomas Macek:16. října 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. října 22:58
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:17. října 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. října 8:12
 
Nahoru Odpovědět 17. října 8:10
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:17. října 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. října 8:21
 
Nahoru Odpovědět 17. října 8:20
Avatar
Tomas Macek
Člen
Avatar
Odpovídá na Peter Mlich
Tomas Macek:17. října 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. října 16:17
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:18. října 8:27

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

Editováno 18. října 8:27
 
Nahoru Odpovědět 18. října 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.