Avatar billede sw_red_6 Nybegynder
18. august 2009 - 15:01 Der er 20 kommentarer og
2 løsninger

treeview..

jeg har en tabel med id, parentid og navn

hvordan får jeg lavet et treeview til den?
Det er sådan at der er muligt med uendeligt led.. altså et child kan have et child som kan have et child som kan have et child ovs, osv, osv...

Der er ingen mulighed for at se hvor en parentid befinder sig ift. en anden parentid..
Avatar billede expnet Seniormester
18. august 2009 - 15:17 #1
Du skal samme alle dine records i en array

og så lave en Recursive Function som loop igennem sig selv og finder parentid for hver id og ligge det i en nye array som du så kan udskrive det på siden efterfølgende..
Avatar billede repox Seniormester
18. august 2009 - 15:18 #2
Kig lidt i den her tråd der omhandler samme emne:
http://www.eksperten.dk/spm/880872
Avatar billede sw_red_6 Nybegynder
18. august 2009 - 15:29 #3
repox>> det ser ganske godt ud.. der skal lige laves en mindre omskrivning til arrays så skulle det virke
Avatar billede repox Seniormester
18. august 2009 - 15:33 #4
En udgave af det er forklaret i bunden af samme tråd.
Avatar billede sw_red_6 Nybegynder
18. august 2009 - 15:38 #5
ikke helt..
Der står hvordan man får trukket det hele ud af DB (hvilket er yderst simpelt), men intet om den rekursive funktion...
Avatar billede repox Seniormester
18. august 2009 - 15:44 #6
Prøv det her, så (utestet):
<?php

    function menu_tree($parent = 0)
    {
   
        static $menuArray = array();
     
        $sql = "SELECT * FROM test WHERE parent = ".$parent;
        $res = mysql_query($sql);
        if(mysql_num_rows($res) == 0)
            return array();
         
        while($obj = mysql_fetch_object($res))
        {
                $menuArray[$obj->id] = menu_tree($obj->id);               
        } 
     
      return $menuArray;
     
    }
 
    $menuArray = menu_tree();
   
    print_r($array);


?>
Avatar billede sw_red_6 Nybegynder
18. august 2009 - 15:53 #7
hmmm er du så ikke ude i at du sender en request til DB for hver enkelt række? hvilket var det der skulle undgås ved at bruge et array?
Avatar billede repox Seniormester
18. august 2009 - 16:09 #8
Jeg tror du har misforstået noget, så.

Du kan ikke undgå noget ved at bruge en bestemt variabeltype.
Du kunne i princippet også bruge en streng du kunne parse til skidtet om nødvendigt.

Funktion laver et rekursivt kald og kontakter databasen mange gange. Jeg ved ikke om der nogle MySQL eksperter der ville kunne sammensætte en tilpas kompliceret streng for at opnå samme resultat med et enkelt databasekald (jeg tvivler dog).

Der er ikke meget at optimere på i denne forbindelse.
Du kunne overveje at cache dit array og optimere den vej igennem, men databasekaldene her er så minimalt resourcekrævende at det ikke ville kunne betale sig at gå op i.
Avatar billede olebole Juniormester
18. august 2009 - 16:12 #9
<ole>

repox >> Det har du vist helt misforstået. Man laver naturligvis kun én forespørgsel til databasen. Resultatet fyldes i et array, som efterfølgende bruges til udskrivning af træet. Ellers bliver det alt for dårligt performende  ;o)

/mvh
</bole>
Avatar billede olebole Juniormester
18. august 2009 - 16:14 #10
- og det er jo præcis, hvad jakobdo omtaler i den tråd, du linkede til  ;o)
Avatar billede repox Seniormester
18. august 2009 - 16:21 #11
#10

Så skal jeg have udpenslet hvad den jakobdo rent faktisk gør.
Altså, fra min vinkel ser det ud som at, hvis jeg nu sætter $parent til 0, så vil jeg få træet rodelementer.

Hertil vil løkken lække alle rodelementerne i et et array ($menu_array) og derefter afsluttes løkken.
For at få rodelementernes children, skal jeg jo køre et nyt mysql-kald for hvert rodelement der var?

Ellers må du lige uddybe, hvis jeg stadig misser pointen i det jakobdo skriver.
Avatar billede repox Seniormester
18. august 2009 - 16:22 #12
staveplade til mig (sry for let ulæseligt indlæg, men håber du forstår mit indlæg ;) )
Avatar billede sw_red_6 Nybegynder
18. august 2009 - 16:37 #13
jakobdo henter hele tabellen ud og smider den i at array, det array skal så bruges til at køre den rekursive funktion og lave treeview..

Der findes jo så den funktion der hedder array_walk_recursive() som muligvis kan bruges (http://dk2.php.net/manual/en/function.array-walk-recursive.php)
Avatar billede repox Seniormester
18. august 2009 - 16:42 #14
Jeg kan ikke se hvilken forskel der er på det jeg gør og det jakobdo gør, så.

Hvis det er fordi du vil lægge hele skidtet i et array og gennemgå arrayet rekursivt istedet skulle jakobdo lave sin sql sætning om.
Altså, fra

SELECT description, webmenu_id, parent FROM webmenu WHERE webactive = '1' AND parent = '$parent' ORDER BY sorting

til

SELECTdescription, webmenu_id, parent FROM webmenu WHERE webactive = '1' ORDER BY sorting


Så får du alle elementerne - og så er jeg helt med på hvad olebole mener. Men ellers giver det ikke mening (for mig ihvertfald).
Avatar billede sw_red_6 Nybegynder
18. august 2009 - 16:52 #15
Det kan jeg godt se, men hvis man læser hvad han skriver i #4 lader det til at det er en fejl..
Avatar billede repox Seniormester
18. august 2009 - 17:05 #16
Så er vi heller ikke kommet nærmere en løsning, kan man sige.
Avatar billede repox Seniormester
18. august 2009 - 17:32 #17
Så'n her måske?

    $sql = "SELECT * FROM menu";
    $res = mysql_query($sql);
    $menu = array();
   
    while($value = mysql_fetch_assoc($res))
    {
        $menu[$value["id"]] = array("id" => $value["id"], "name" => $value["name"], "parent" => $value["parent"]);
    }



    function generate_tree_view($array, $parent = 0, $level = 0)
    {
   
        $has_children = false;
        foreach($array as $key => $value)
        {
            if ($value['parent'] == $parent)
            {                 
   
                if ($has_children === false)
                {
                    $has_children = true; 
                    echo '<ul class="level-' . $level . '">';
                    $level++;
                }
   
                echo '<li><a href="?id=' . $value['id'] . '">' . $value['name'] . '</a>';
                generate_tree_view($array, $key, $level);
                echo '</li>';
            }
   
        }

        if ($has_children === true)
              echo '</ul>';
    }
   
    generate_tree_view($menu);
Avatar billede olebole Juniormester
18. august 2009 - 22:29 #18
Du kan prøve at se, om du kan bruge noget fra disse tråde:
    http://www.eksperten.dk/spm/848643#reply_7228470
    http://www.eksperten.dk/spm/852304
Avatar billede sw_red_6 Nybegynder
19. august 2009 - 12:11 #19
perfekt, med meget kraftig inspiration fra oleboles 1. link ser det ud til at jeg har fået det til at virke..

så mangler jeg bare at få nogle svar..
Avatar billede olebole Juniormester
19. august 2009 - 12:44 #20
repox >> lad os dele  =)
Avatar billede repox Seniormester
19. august 2009 - 14:19 #21
Den er jeg med på ;)
Avatar billede olebole Juniormester
20. august 2009 - 09:08 #22
Tak for points  =)
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

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