Avatar billede avminarm Juniormester
28. september 2005 - 22:03 Der er 21 kommentarer og
1 løsning

recursivt array fra database (træ menu) DEL 2

HEj Jeg har tidliger fået stor hjælp af jakobdo i sprg: http://exp.dk/spm/645064 - man mangler lige det sidste.

jeg henter data ud fra en database med enne funktion:

$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,"");

Her får jeg så et array der liger dette:

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
        )
)

men jeg har brug for at arrayet skal se sådan ud:

array    ("TOPlevel1" => "http://#1",
                "TOPlevel2" => array("node21" => "http://www.node21.com",
                                  "node22" => "http://www.node22.com",
                                  "node23" => array    ("node231" => "http://www.node231.com",
                                                    "node232" => "http://www.node232.com",
                                                    )),
                "TOPlevel3" => "http://#3",
                );
Det jeg mangler er atså at få selve linket med på de steder hvor der er en TOPlevel - det kan måske hjælpe på forståelsen at kigge i sprg: http://exp.dk/spm/645064

Jeg håber i kan hjælpe?
Avatar billede horsmark Nybegynder
28. september 2005 - 22:55 #1
well det er faktiskt en knaldløsning du har gang i da du laver et opslag pr node og det kan godt blive til mange opslag... OG så mangler du det der hedder sequence id altså hvis der er 3 childs hvilken rækkefølge skal disse "noder" så præsenteres i.

db tabel træstruktur

id integer
par_id integer
seq_id integer
link char(255)
navn char(255)
titel char(255)
kollonne1
kollonne2 osv

så læser du det hele ind i ét array der _ikke_ er rekursivt (det klarer efterfølgende funktion for)
$sql =     "
  SELECT * FROM
    treetable
  ORDER BY
  par_id,
  seq_id
";
$result = mysql_query($sql) or die( mysql_error() );
while( $row = mysql_fetch_array($result) ){
$aTreeNodes[] = $row;
}

her printes så træstrukturen:
generateTree(0, -1);
function generateTree($node_id, $tab) {
$tab++;
foreach ( $aTreeNodes as $aNode ) {
  if ($aNode['par_id'] == $node_id) {
  for( $i=0; $i<$tab;$i++){
    print "&nbsp;";
  }
  print $aNode['node_id']."<br>";
  generateTree($aNode['node_id'], $tab);
  }
}
}
Avatar billede avminarm Juniormester
28. september 2005 - 23:18 #2
horsmark>> - du har ganske sikkert ret ;o) - men jeg skal IKKE have genereret en hel menu - men alene have returneret et array - så jeg benytter i en klasse (Multiexpandmenu - fra phpclasses.org).

db struktur 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',
  `vis` enum('y','n') NOT NULL default 'y',

Hvis du har tid må du meget gerne hjælpe med at danne arrayet?
Avatar billede horsmark Nybegynder
28. september 2005 - 23:29 #3
er desværre på vej i kanen *sorry*
Avatar billede horsmark Nybegynder
29. september 2005 - 08:08 #4
ang 28/09-2005 22:55:26

tilret lige

  print $aNode['node_id']."<br>";
  generateTree($aNode['node_id'], $tab);

til

  print $aNode['id']."<br>";
  generateTree($aNode['id'], $tab);
Avatar billede horsmark Nybegynder
29. september 2005 - 08:48 #5
http://horsmark.com/test.php :-)

koden er:

    $sql = " SELECT * FROM mintabel ORDER BY par_id, seq_id";
    $result = mysql_query($sql) or die( mysql_error() );
    while( $row = mysql_fetch_array($result) ){
        $aTreeNodes[] = $row;
    }

    generateTree(0);
    function generateTree($node_id = null, $tab = null) {
      global $aTreeNodes;
      // Eftersom Arrayet $aTreeNodes er global bliver ponteren ikke nulstillet derfor tager vi lige en kopi
      $aTree = $aTreeNodes;
        is_null($tab) ? $tab = 0 : $tab++;
      foreach ( $aTree as $aNode ){
            if ($aNode['par_id'] == $node_id) {
                for($t = 0; $t < $tab; $t++){
                    print "&nbsp;&nbsp;";
                }
              print $aNode['name']."<br>";
                generateTree($aNode['id'], $tab);
            }
        }
    }
Avatar billede avminarm Juniormester
29. september 2005 - 10:02 #6
det ser fint ud ;o) - men det er desværre ikke helt det jeg søger
Avatar billede horsmark Nybegynder
29. september 2005 - 10:15 #7
yes postede i det forkerte spm sorry
Avatar billede jakobdo Ekspert
29. september 2005 - 21:11 #8
Prøv at vis hvilken struktur du skal bruge.
Jeg mener:
$menu = array("TopNode1" => "Link", array("sub1" => "subLink1"));
osv...
Avatar billede avminarm Juniormester
29. september 2005 - 21:54 #9
ja det er lige den struktur jeg leder efter sådan:

array ("TOPlevel1" => "link",
      "TOPlevel2" => array("node21" => "http://www.node21.com",
                            "node22" => "http://www.node22.com",
                            "node23" => array ("node231" => "http://www.node231.com",
                                                    "node232" => "http://www.node232.com",
                                                    )),
                "TOPlevel3" => "LINK",
                );
Avatar billede jakobdo Ekspert
29. september 2005 - 22:00 #10
Men der har du jo ikke noget link på TopLevel2.
Ligesom min første løsning...
Avatar billede avminarm Juniormester
29. september 2005 - 23:01 #11
arrggh - pokkers - der skal være link på alle

array ("TOPlevel1" => "link",
      "TOPlevel2" => "link2",array("node21" => "http://www.node21.com",
                            "node22" => "http://www.node22.com",
                            "node23" => array ("node231" => "http://www.node231.com",
                                                    "node232" => "http://www.node232.com",
                                                    )),
                "TOPlevel3" => "LINK",
                );
Avatar billede avminarm Juniormester
29. september 2005 - 23:02 #12
også på node23
Avatar billede avminarm Juniormester
01. oktober 2005 - 12:34 #13
slet ingen bud?
Avatar billede horsmark Nybegynder
01. oktober 2005 - 15:11 #14
ok så da :-)

Det du ønsker kan du ikke få som php array :-( fordi der kan kun være én key til én value. Det du ønsker at have én key med en value der er link OG en value mere der er et array hvis der er childNodes ergo submenuer og det kan du ikke.

array(
"key 1 navn" => "link 1",
"key 2 navn" => "link 2"
);

hvis du ønsker et multi array kan du have strukturen på denne måde:

array(
0 => array(
        "menu 1 navn" => "link 1",
        "submenus" => array(
                        0 => array(
                              "submenu 1 navn" => "link 3"
                            ),
                        1 => array(
                              "submenu 2 navn" => "link 4"
                            )
                      )
      ),
1 => array(
        "menu 2 navn" => "link 5"
      ),
2 => array(
        "menu 3 navn" => "link 6",
        "submenus" => array(
                        0 => array(
                              "submenu 2_1 navn" => "link 3"
                              )
                      )
);
Avatar billede horsmark Nybegynder
01. oktober 2005 - 15:17 #15
...eller

array(
0 => array( "name" => "menu 1 navn",
            "link" => "link 1",
            "subs" => array( 0 => array( "name" => "menu 1_1 navn", "link" => "link 1_1", "subs" => false),
                                              1 => array( "name" => "menu 1_2 navn", "link" => "link 1_2", "subs" => false),
                                              2 => array( "name" => "menu 1_3 navn", "link" => "link 1_3", "subs" => false)
            ),
1 => array( "name" => "menu 2 navn",
            "link" => "link 2",
            "subs" => array( 0 => array( "name" => "menu 2_1 navn", "link" => "link 2_1", "subs" => false)
            ),
);
Avatar billede avminarm Juniormester
02. oktober 2005 - 13:46 #16
hmmmm - pokkers osse - nå så må jeg vel finde på noget andet - men tak for hjælpen - smid et svar hvis i vil have points
Avatar billede horsmark Nybegynder
02. oktober 2005 - 16:23 #17
hey hvad er det du overordnet ønsker at bygge ? Måske har jeg en løsning liggende på det ?
Avatar billede avminarm Juniormester
02. oktober 2005 - 16:37 #18
jeg ønsker en træ menu som folder ind+ud når man klikker på der forskellige niveauer - men ALLE niveauer SKAL være klikbare = med link (hvis linket ikke skal bruges sætter jeg bare en # ind) + jeg skal kunne udskifte de små billedfiler der viser sig når et menu punkt er lukket/åbent/aktivt.

giver det mening?
Avatar billede avminarm Juniormester
03. oktober 2005 - 07:48 #19
og menuens indhold skal hentes i en db
Avatar billede avminarm Juniormester
09. oktober 2005 - 19:55 #20
er det noget du har liggende?
Avatar billede avminarm Juniormester
16. oktober 2005 - 14:01 #21
haloo "bank bank" - horsmark er du her stadigvæk?
Avatar billede avminarm Juniormester
22. oktober 2005 - 13:40 #22
ok så lukker jeg sprg - jeg vil prøve at rode lidt med: www.destroydrop.com/javascript/tree/ - det ser fornuftigt ud
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