Avatar billede avminarm Juniormester
02. september 2005 - 21:17 Der er 29 kommentarer og
1 løsning

recursivt array fra database (træ menu)

Hej

Jeg sider og roder med en menu i træstruktur - jeg hr hentet klassen multixpandmenu på phpclasses.org g har ingen problemer med at bruge selve klassen MEN:

Jeg skal hente mine links i min dtabase som ser således ud:

-- Struktur-dump for tabellen `menu_sub`

CREATE TABLE menu_sub (
  sub_id int(12) NOT NULL auto_increment,
  `text` varchar(50) NOT NULL default '',
  href varchar(255) NOT NULL default '',
  menu_top_id int(12) NOT NULL default '0',
  sub_child int(12) NOT NULL default '0',
  PRIMARY KEY  (sub_id)
) ;

-- Struktur-dump for tabellen `menu_top`

CREATE TABLE menu_top (
  top_id int(11) NOT NULL auto_increment,
  `text` varchar(50) NOT NULL default '',
  href varchar(255) NOT NULL default '',
  `show` enum('y','n') NOT NULL default 'y',
  PRIMARY KEY  (top_id)
) ;

I menu top findes top level linksene til hvert toplink kan der være x-antal sublevels - dvs en sublevel kan have sublevels (altså som et trådet forum eller lignende)

mit problem består i at jeg skal hente fra databasen (meget gerne via en funktion) så jeg ender op med noget der ligner denne struktur.

array    ("TOPnode1" => "http://#1",
                "TOPnode2" => array("node21" => "http://www.node21.com",
                                  "node22" => "http://www.node22.com",
                                  "node23" => array    ("node231" => "http://www.node231.com",
                                                    "node232" => "http://www.node232.com",
                                                    )),
                "TOPnode3" => "http://#3",
                );

Jeg håber det er til at forstå - eller så spørg!
Avatar billede jakobdo Ekspert
02. september 2005 - 21:30 #1
Prøv at se min måde at bygge en træ menu op på her: http://www.eksperten.dk/spm/644538
Avatar billede avminarm Juniormester
02. september 2005 - 21:54 #2
jakobdo>> jeg har kigget på det du gør i spørgsmålet - men jeg er som sådan ikke interesseret i en træ menu - jeg skal "bare" have returneret et array magen til ovenstående fra databasen - jeg kan godt se at visse elemeter fra dit script nok kan bruges - men jeg kan simpelt hen ikke lige se hvordan jeg skal stykke det sammen til ovenstående (jeg har bakset med det i 2 dage nu og er efterhånden godt ør!)

Hvis det er en fordel at ændre på database strukturen er dette intet problem - strukturen på databasen ligger pt ikke fast.

Jeg håber du vil hjælpe?
Avatar billede jakobdo Ekspert
02. september 2005 - 22:13 #3
Hvis du ændre din database struktur til den jeg har vist, så kan du jo tage min kode, og koden her vil genere den struktur du ønsker tror jeg:

$menuArray = array();

$query = mysql_query("
SELECT
    id,
    tekst,
    link,
    parent
FROM
    menu
ORDER BY
    parent,
    id");
if(mysql_num_rows($query) > 0)
{
    while($row = mysql_fetch_assoc($query))
    {
        $menuArray[] = $row;
    }
}
else
{
    $menuArray = array("Ingen menupunkter, opret nogle");
}

function SubSearch($array, $dest_Arr, $owner)
{
    while (list($key) = each($array))
    {
        if ($array[$key]['parent'] == $owner)
        {
            $tempArr = $array[$key];
            SubSearch(&$array, &$tempArr, $array[$key]['id']);
            $dest_Arr['submenu'][] = $tempArr;
            unset($array[$key]);
        }
    }
    reset($array);
}

while (list($key) = each($menuArray))
{
    if ($menuArray[$key]['parent'] == 0)
    {
        $tempArr = $menuArray[$key];
        SubSearch(&$menuArray, &$tempArr, $menuArray[$key]['id']);
        unset($menuArray[$key]);
        $MyMenu[] = $tempArr;
    }
    reset($menuArray);
}

Den laver et array, hvor submenuer er nye arrays.
Og sådan fortsætter den i en uendelighed.
Avatar billede avminarm Juniormester
02. september 2005 - 22:18 #4
det ser dejligt ud - men hvor returneres selve "hoved arrayet"? - jeg skal have det gemt i en variabel
Avatar billede avminarm Juniormester
02. september 2005 - 22:20 #5
jeg har også lidt svært ved at finde ud af hvordan din databasestruktur skal finde ud af hvilke submenuer der hr submenuer
Avatar billede avminarm Juniormester
02. september 2005 - 22:31 #6
jeg får denne fejlmeddelse fra PHP - hvad betyder det?

Call-time pass-by-reference has been deprecated - argument passed by value; If you would like to pass it by reference, modify the declaration of [runtime function name](). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file. However, future versions may not support this any longer
Avatar billede jakobdo Ekspert
02. september 2005 - 22:49 #7
Hovedarrayet er: $MyMenu
En submenu ved ikke om den har submenuer.
Men via parent kan man se hvem som er dens parent.
Så vil du finde submenuer til menu id = 1, kan du f.eks. lave en sql som giver dig alle menuer med parent = 1.
Den fejl du beskriver, prøv at ret linien:
SubSearch(&$menuArray, &$tempArr, $menuArray[$key]['id']);
til:
SubSearch($menuArray, $tempArr, $menuArray[$key]['id']);
Avatar billede avminarm Juniormester
02. september 2005 - 22:55 #8
nu er der ingen fejl meddelse mere - den returnerer dette array: Array ( [0] => Array ( [id] => 1 [text] => TOPlevel1 [href] => # [parant] => 0 [show] => y ) [1] => Array ( [id] => 2 [text] => TOPlevel2 [href] => # [parant] => 0 [show] => y ) [2] => Array ( [id] => 3 [text] => Sub 1 [href] => index.php [parant] => 1 [show] => y ) [3] => Array ( [id] => 4 [text] => sub1 sub1 [href] => hhsd?sdf.php [parant] => 3 [show] => y ) )

så det fungrer ikke helt endnu?
Avatar billede jakobdo Ekspert
02. september 2005 - 22:57 #9
Bruger du min database struktur?
Avatar billede avminarm Juniormester
02. september 2005 - 23:00 #10
ja - du kan se et test output her: http://wagners.users.whitehat.dk/menu/db_test.php

db ser sådan her ud:
  `id` int(12) NOT NULL auto_increment,
  `text` varchar(50) NOT NULL default '',
  `href` varchar(255) NOT NULL default '',
  `parant` int(12) NOT NULL default '0',
  `show` enum('y','n') NOT NULL default 'y',
Avatar billede avminarm Juniormester
02. september 2005 - 23:44 #11
jeg smuter i seng nu - håbe vi sammen kn inde en løsning - der er i dtabasen 2 toplevel menupunkter og top1 har 1 sub som har en sub
Avatar billede jakobdo Ekspert
03. september 2005 - 08:20 #12
Der er noget som ser mærkeligt ud ja!
Og nu kan jeg ikke få åbnet din side...
Avatar billede avminarm Juniormester
03. september 2005 - 08:20 #13
dooo - nu er databasen rette så det hedder tekst og link og parent - men det giver fejl: Warning: Variable passed to each() is not an array or object in /usr/home/whitehat_dk/users/wagners/menu/db_test.php on line 21 (se på test link)
Avatar billede jakobdo Ekspert
03. september 2005 - 08:23 #14
Jeg får fejlen: Warning: Variable passed to each() is not an array or object in /usr/home/whitehat_dk/users/wagners/menu/db_test.php on line 21

Fatal error: Maximum execution time of 30 seconds exceeded in /usr/home/whitehat_dk/users/wagners/menu/db_test.php on line 33

Prøv at kontakt mig på msn: jakobdo (at) hotmail (dot) com
Avatar billede avminarm Juniormester
03. september 2005 - 16:03 #15
nu har jge prøvet med MSN (det har jeg ikke brugt før - men det ser ud til at du er offline) - du kan se files indhold her: http://wagners.users.whitehat.dk/menu/show_test.php - den viser hvad db_test.php indeholder
Avatar billede jakobdo Ekspert
03. september 2005 - 22:28 #16
Går der noget helt galt?
Den her skriver jo intet ud: print_r ($MyMenu);
Avatar billede avminarm Juniormester
03. september 2005 - 22:42 #17
det er i selve funktionen den brokker sig??

function SubSearch($array=array(), $dest_Arr, $owner){
    while (list($key) = each($array)) { // HER ER LINJE 21?
        if ($array[$key]['parent'] == $owner) {
            $tempArr = $array[$key];
            SubSearch($menuArray, $tempArr, $menuArray[$key]['id']);
            //SubSearch(&$array, &$tempArr, $array[$key]['id']);
            $dest_Arr['submenu'][] = $tempArr;
            unset($array[$key]);
        }
    }
    reset($array);
}
Avatar billede jakobdo Ekspert
04. september 2005 - 12:13 #18
Det ser ud som om den ikke bygger array'et korrekt op!
Hvad skete der hvis du
udkommenterede:
SubSearch($menuArray, $tempArr, $menuArray[$key]['id']);
og brugte denne:
SubSearch(&$array, &$tempArr, $array[$key]['id']);
Hvis du får fejl, så prøv at ret til:
SubSearch($array, $tempArr, $array[$key]['id']);
Avatar billede jakobdo Ekspert
04. september 2005 - 15:06 #19
Jeg tror sgu jeg har luret den!
Pænt er det ikke, men test lige:

$menuArray = array();

function buildMenu($id,$mLink)
{
    $query = mysql_query("
        SELECT
            id,
            tekst,
            link
        FROM
            menu
        WHERE
            parent = ".$id."
        ORDER BY
            id");
    if(mysql_num_rows($query) > 0)
    {
        $menuItem = array();
        while($row = mysql_fetch_assoc($query))
        {
            $link = $row['link'];
            $menuItem[$row['tekst']] = buildMenu($row['id'],$link);
        }
        return $menuItem;
    }
    else
    {
        return $mLink;
    }
}

$menuArray = buildMenu(0,"");
Avatar billede avminarm Juniormester
04. september 2005 - 20:14 #20
nej det er ikke pænt - det er bare SÅ smukt det fungerer perfekt - tusind tak for hjælpen - smider du lige et svar.

PS: Når du nu selv spiller bold - hvem er så din klub i sas ligaen??
Avatar billede jakobdo Ekspert
04. september 2005 - 20:19 #21
Jeg skal nok se om jeg evt ikke kan lave det pænere en af dagene.
Og jeg har ikke et hold som sådan, men jeg holder nu med Brøndby
Avatar billede avminarm Juniormester
04. september 2005 - 20:23 #22
så var det nok heldigt vi ikke diskuterede fodbold - for der var vi næppe blevet enige ;o).

Endnu engang tak for hjælpen - og tænk at det alligevel kunne koges ned til så få linier - fikst lille "chat program" - kan man købe sådan noget hejs selv - det kunne være smrt når min far (ofte) har lavet kuk i sin egen pc.
Avatar billede jakobdo Ekspert
04. september 2005 - 20:27 #23
Du kan godt "købe" den løsning jeg brugte, men det koster kassen.
Prøv at kig på programmet: http://www.famatech.com/
Radmin (mener du kan hente den gratis)

Og takker for point!
Skal nok vende tilbage, når jeg har en løsning som nøjes med en SQL.
Avatar billede avminarm Juniormester
04. september 2005 - 20:30 #24
ok - jeg kigger på det - tak
Avatar billede avminarm Juniormester
28. september 2005 - 20:22 #25
hej igen - jeg håber du lige har tid til at lave en (forhåbentlig lille rettelse) - jeg har nemlig fundet ud af jeg har brug for link adressen ved hvert link også toplevelsne? - jeg har brug for at arrayet ser sådan her ud:

array    ("TOPnode1" => "http://#1",
                "TOPnode2" => array("node21" => "http://www.node21.com",
                                  "node22" => "http://www.node22.com",
                                  "node23" => array    ("node231" => "http://www.node231.com",
                                                    "node232" => "http://www.node232.com",
                                                    )),
                "TOPnode3" => "http://#3",
                );

Men det du fik til at fungere sidst for mig se sådn her ud:

Array
(
    [TOPlevel1] => Array
        (
            [Sub 1] => Array
                (
                    [sub1 sub1] => Array
                        (
                            [sub til id 4] => sdsds
                        )

                    [sub til id 3] => okok
                )

            [Aktil level 1] => sdsd
        )

    [TOPlevel2] => #
    [TOP level 3] => Array
        (
            [sun til 3] => scsdsd
            [sub til 3] => sdsdf
        )
)

Som du kan se mangler selev link adressen ud for de "nodes" der har unerpunkter.

Jeg opretter gerne et nyt spørgsmål med nye points hvis du ønsker det ;o)
Avatar billede jakobdo Ekspert
28. september 2005 - 21:37 #26
Prøv at opret et nyt spørgsmål, jeg kan desværre ikke lige samle tankerne om det lige nu!
Men skal gerne forsøge i morgen evt! :o)
Avatar billede avminarm Juniormester
28. september 2005 - 22:03 #27
Det lyder helt fint - her er link til nyt sprg: http://www.eksperten.dk/spm/651742
Avatar billede jakobdo Ekspert
28. september 2005 - 22:09 #28
Jeg kunne forstille mig vi skal snakke flere felter!
Så TopLevel1 kommer til at indeholde: TEKST, LINK, undermenuer...
Men hvordan den lige skal drejes kan jeg ikke lure! :o(
Avatar billede avminarm Juniormester
28. september 2005 - 22:13 #29
nej det kan jeg heller ikke - jeg har faktisk selv prøvet ;o)
Avatar billede avminarm Juniormester
29. september 2005 - 20:43 #30
Hej - kan jeg lokke dig til at hjælpe? http://www.eksperten.dk/spm/651742
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