Avatar billede downloading Nybegynder
10. januar 2006 - 14:58 Der er 16 kommentarer og
1 løsning

Udskrive rekursions funktion, som rulleliste, som på eksperten.dk

Hej.

Jeg skal have udskrevet mine katagorier som her på eksperten (den rulleliste der er når man skal oprette et spørgsmål).

Jeg har fundet dennne her funktion her på eksperten, og lavet lidt om, men tror sku jeg er ved at dumme mig.

p.s. Har ingen anelse om hvordan rekursion fungere.

Sådan ser databasen ud:

CREATE TABLE `catagori` (
  `id` int(11) NOT NULL auto_increment,
  `Parent` decimal(10,0) NOT NULL default '0',
  `Name` text NOT NULL,
  `Description` text NOT NULL,
  PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT=3 ;

og så min funktion der stinker :-)

<?php
    include('../mysql.php');

function getMenu($rootId=0,$topLevel=true) {
    $topul = $topLevel;

    static $items = null;

    if( $items == null  )  {
        // Load everything
        $sql = "SELECT * FROM catagori ORDER BY id";

        $res = mysql_query($sql) or die(mysql_error());

        while($row = mysql_fetch_assoc($res))
            $items[$row['id']] = $row;
    }

    if( $rootId != 0 && $topLevel) {
    if ($topul==true) {
        print "<ul id=\"nav\">";
        $topul = false;
    } else {
        print "<ul>";
        $topul = false;
    }
        print '<option value=\"'.$items[$rootId]['Parent'].'\">'.$items[$rootId]['Description'].'</option>';
    }

    $noOutput = true;

    foreach(array_keys($items) as $i ) {
        if( $items[$i]['Parent'] == $rootId ) {
            if( $noOutput )  {
                $noOutput = false;
                if ($topul==true) {
            //print "<ul id=\"nav\">";
            $topul = false;
        } else {
            print "<ul>";
            $topul = false;
        }
        }
            print '<option value="'.$items[$i]['Parent'].'">'.$items[$i]['Description'].'</option>';
            getMenu($items[$i]['id'],false);
        }
    }

    if(! $noOutput )
        //print "</ul>";

    if( $rootId != 0 && $topLevel ) {
        //print "</ul>";
    }
}


getMenu();
//echo "<hr />";
//getMenu(7);
?>
Avatar billede rednex Nybegynder
10. januar 2006 - 16:20 #1
Jeg kigger lige på det, så hæng lige fast :o)
Avatar billede rednex Nybegynder
10. januar 2006 - 16:21 #2
Vil du have kategorierne udskrevet ligesom på exp? (Kategori :: Underkategori :: UnderUnderkat) i din select?
Avatar billede downloading Nybegynder
10. januar 2006 - 16:25 #3
jaja.... meget gerne :-)
Avatar billede downloading Nybegynder
10. januar 2006 - 16:56 #4
Er du kommet frem til noget? Er herre spændt :-)
Avatar billede rednex Nybegynder
10. januar 2006 - 17:29 #5
Jeg arbejder på sagen, men jeg bliver hele tiden distraheret :o) Man skal holde tungen lige i munden når man arbejder med rekursive funktioner, så det tager lidt tid.

Men bare rolig, jeg har ikke givet op endnu :o)
Avatar billede downloading Nybegynder
10. januar 2006 - 17:33 #6
Yes! Lyder godt.. Jeg har aldrig fattet så meget af dem :-)
Avatar billede rednex Nybegynder
10. januar 2006 - 17:58 #7
Hehe, jeg kunne vist lige så godt have hjulpet dig i går. Nu har jeg skrevet den fra bunden (det er lettere at forstå når man selv udtænker skidtet) :o)

Der er faktisk 2 rekursive funktioner; 1 til at konstuere træ-strukturen i et array og en anden til at udskrive kategorierne. De kunne sikkert samles til én, men det har jeg ikke lige overskud til at udtænke :o)

<?php

include('../mysql.php');

function getMenu()
{
    function getChildren($id, $items)
    {
        $children = array();
        foreach( $items as $item ) {
            if( $item['Parent'] == $id ) {
                $children[$item['Name']]['id'] = $id;
                $children[$item['Name']]['Children'] = getChildren($item['id'], $items);
            }
        }
        return $children;
    }

    function renderMenu($node, $base = '')
    {
        foreach( $node as $name => $value ) {
            if( $base != '' )
                $text = "$base :: $name";
            else
                $text = $name;
            echo "<option value=\"{$value['id']}\">$text</option>\n";
            if( count($value['Children']) )
                renderMenu($value['Children'], $text);
        }
    }

    $items = array();

    $res = mysql_query('SELECT * FROM catagori ORDER BY id') or die(mysql_error());
    while ($row = mysql_fetch_assoc($res))
        $items[$row['id']] = $row;
    mysql_free_result($res);

    $menu = getChildren(0, $items);
    echo "<select name=\"test\">\n";
    renderMenu($menu);
    echo '</select>';
}

getMenu();

?>
Avatar billede downloading Nybegynder
10. januar 2006 - 18:12 #8
orv :-)

Det ser alt for nice ud! Thanks!

Men den udskriver ikke helt id...
Avatar billede downloading Nybegynder
10. januar 2006 - 18:21 #9
lige et hurtigt spørgsmål mere.. Hvis jeg nu har denne her side, og skal udskrive menuen to gange, hvordan gør jeg så, kan jeg ikke ligge det hele i en variable, og hvordan gøres dette?

Thanks..
Avatar billede rednex Nybegynder
10. januar 2006 - 18:40 #10
There ya go :o) 1 stk opdateret rekursiv select menu :o)

<?php

include('../mysql.php');

function getMenu()
{
    function getChildren($id, $items)
    {
        $children = array();
        foreach( $items as $item ) {
            if( $item['Parent'] == $id ) {
                $children[$item['Name']]['id'] = $item['id'];
                $children[$item['Name']]['Children'] = getChildren($item['id'], $items);
            }
        }
        return $children;
    }

    function renderMenu($node, &$items, $base = '')
    {
        foreach( $node as $name => $value ) {
            if( $base != '' )
                $text = "$base :: $name";
            else
                $text = $name;
            $items[] =  "<option value=\"{$value['id']}\">$text</option>\n";
            if( count($value['Children']) )
                renderMenu($value['Children'], $items, $text);
        }
    }

    $items = array();

    $res = mysql_query('SELECT * FROM catagori ORDER BY id') or die(mysql_error());
    while ($row = mysql_fetch_assoc($res))
        $items[$row['id']] = $row;
    mysql_free_result($res);

    $menu = getChildren(0, $items);
    $list = array();
    renderMenu($menu, $list);

    return "<select name=\"test\">\n" . implode("\n", $list) . '</select>';
}

$menu = getMenu();
echo $menu
?>
Avatar billede rednex Nybegynder
10. januar 2006 - 19:13 #11
Jeg smutter til bestyrelsesmøde nu. Du kan selv tage point, for jeg har lidt dårlig samvittighed over at snuppe 200 point for at henvise til et andet spm :o)
Avatar billede downloading Nybegynder
10. januar 2006 - 20:56 #12
mange tak :-) men syntes nu du har fortjent dem..

Nu tager den jo udgangspunkt i id'et 0, og tager alle katagorier der er undergrupper til 0 (hvilket jo er alle katagorier), hvis den nu i stedet skal tage udgangspunkt i id'et 3, som så fx er Windows::Internet::Fildeling så skal den tage Fildeling, og så alle underkatagorier til fildeling, og alle deres undergrupper osv. Hvordan gøres det?
Avatar billede downloading Nybegynder
10. januar 2006 - 20:57 #13
nej vent, det har jeg jo sådan set ikke brug for... Undskyld, nu er jeg gået i selvsving :-)
Avatar billede rednex Nybegynder
10. januar 2006 - 22:10 #14
Hehe, jeg kender det godt. Det er ikke noget problem at starte et andet sted i "træet". Der skal kun rettes 2 linier:

function getMenu() rettes til function getMenu($rootId = 0) og
$menu = getChildren(0, $items);rettes til $menu = getChildren($rootId, $items);

Så kan du starte lige hvor du har lyst, og få udskrevet træet derfra :o)
Avatar billede downloading Nybegynder
01. februar 2006 - 23:14 #15
hov.. Sorry.. Glemte at få dig til at skrive et svar :-)

p.s. igen mange tak!!!
Avatar billede rednex Nybegynder
03. februar 2006 - 00:04 #16
Det kommer her :o)
Avatar billede downloading Nybegynder
05. februar 2006 - 19:32 #17
lyder godt:)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester