Gå til innhold

lage hierarchy med array og sub array


Anbefalte innlegg

bruker scriptet under for å lage en dynamisk meny, men det er en liten ting jeg ikke får til helt som jeg vil:

 


   $headers = array(                 

           'Header1' => 'submenu.php?s=1',                 

           'Header2' => 'submenu.php?s=2',                 

           'Header3' => 'submenu.php?s=3'                 

           );



   $sub_1 = array(

           'SubHeader1' => 'http://pear.php.net',

           'SubHeader2' => 'http://www.zend.com',

           'SubHeader3' => 'http://www.php.net'

           );



   $sub_2 = array(            

           'SubHeader1' => 'http://www.perdue.net',

           'Layer_example' => 'submenu.php?s=2&b=1',

           'SubHeader3' => 'http://www.sourceforge.net'

           );



   $sub_2_layer = array(            

           'SubSubHeader1' => 'http://www.zend.com/',    

           'SubSubHeader2' => 'http://www.php.net',    

           'SubSubHeader3' => 'http://smarty.php.net'

           );



   $sub_3 = array(            

           'SubHeader1' => 'http://www.fastsearch.com',    

           'SubHeader2' =>'http://www.alltheweb.com',    

           'SubHeader3' => 'http://www.gravitonic.com'

           );



foreach ( $headers as $key => $value ) {

       echo "<a href='$value'>$key</a><br>";

       if (($key == "Header1") && ($s == "1")) {

               foreach ( $sub_1 as $key => $value ) {

                       echo "<ul><a href='$value'>$key</a></ul>";

               }



       }

       if (($key == "Header2") && ($s == "2")) {

               foreach ( $sub_2 as $key => $value ) {

                       echo "<ul><a href='$value'>$key</a></ul>";

                       if (($key == "Layer_example") && ($s == "2") && ($b == "1"))

                       {

                               foreach ( $sub_2_layer as $key => $value )

{

                                       echo "<ul><ul><a href='$value'>$key</a></ul></ul>";

                                       if ($key == "SubSubHeader3") {$b = "2";}

                               }

                       }

               }

       }



       if (($key == "Header3") && ($s == "3")) {

               foreach ( $sub_3 as $key => $value ) {

                       echo "<ul><a href='$value'>$key</a></ul>"; }

       }

}

 

når man trykker på en av toplinkene kommer jo underlinkene fram på menyen og det ser helt greit ut i en browser, men i koden blir det sånn:

 


<ul>

<li>toplink</li>

<ul><li>underlinke</li></ul>

</ul>

 

men det jeg altså vil ha fram er

 


<ul>

<li>toplink

<ul><li>underlinke</li></ul>

</li>

</ul>

 

det jeg tenker men ikke får helt til er da,

1.Hvis en toplink er merket så skal den ikke avsluttes med </li>

2. hvis det er flere underlinker så skal alle være:

<li>underlink</li>

men den første skal starte med <ul><li> istedenfor bare<li>

og den siste skal slutte med </li></ul> istedenfor bare </li>

3. når siste underlink er printet skal det føres på </li> for å avslutte toplinken.

Lenke til kommentar
Videoannonse
Annonse
kom på at jeg kan fixe en del av problemene med count($sub_1)) for å definere forskjell på første siste og de i mellom av underlinkene, men er fortsatt en del ting som blir litt feil så deet hadde fortsatt vært fint med noen forslag fra andre.

 

Forslag coming up... :D

 

Det slo meg at det kanskje er enklere å håndtere en slik meny-struktur rekursivt.

 

For å få til det må datastrukturene planlegges litt bedre.

Hvis datastrukturene for menyer istf deklareres slik:

 

$str_menuData = Array(

'header' => array(

           'Header1' => Array('type'=>'submenu','value'=>'sub_1'), 

           'Header2' => Array('type'=>'submenu','value'=>'sub_2'), 

           'Header3' => Array('type'=>'submenu','value'=>'sub_3'), 

            ),



'sub_1' = array(

           'SubHeader1' => Array('type'=>'link','value'=>'http://pear.php.net'), 

           'SubHeader1' => Array('type'=>'link','value'=>'http://www.zend.com'), 

           'SubHeader1' => Array('type'=>'link','value'=>'http://www.php.net'), 

             )

 );



..osv



 

 

Da trenger vi en funksjon som traverserer datastrukturen og bygger HTML.

 

Noe slikt:

 


function fncGetSubMenu($str_menuData,$activeMenu)

{

   $strRetVal = "";

   $objData = $str_menuData[$activeMenu];

       

   foreach($objData as $key => $value)

   {

       $strItemType = $objData['type'];

       $strValue = $objData['value']; 

       

       if($itemType == 'submenu')         

         { 

            $strSubMenu = fncGetSubMenu($str_menuData,$strValue);

            if($strSubMenu!="") { $strRetVal .= "<LI>$strSubMenu</LI>";}

         }

       else

         { $strRetVal .= "<LI>$value</LI>"; }        

   }

   

   if ($strRetVal<>"") { $strRetVal = "<UL>$strRetVal</UL>";}

   return $strRetVal;

}



 

 

Dermed kan menyen bygges med ett funksjonskall:

 

 

$strMenuHTML = fncGetSubMenuHTML(str_menuData,"header");

 

 

Jeg har skrevet koden on-the-fly (ikke testet), så den må nok bearbeides litt... men du ser hvor jeg vil hen?

Lenke til kommentar

Takk takk da tror jeg at jeg kom nærmere ihvertfall, men det er noe feil med hvordan den viser $value for det som ble printet ut var:

 


<ul>

<li>Array</li>

<li>Array</li>

<li>Array</li>

<li>Array</li>

<li>Array</li>

<li>Array</li>

</ul>

skrev om litt for det er sånn her jeg til syvende og sist tror jeg skal ha det.


$str_menuData = Array(

'header' => Array(

           'welcome' => Array('type'=>'link','value'=>'?p=1'),

           'about' => Array('type'=>'link','value'=>'?p=2'),

           'cv' => Array('type'=>'link','value'=>'?p=3'),

           'links' => Array('type'=>'link','value'=>'?p=4'),

           'computers' => Array('type'=>'submenu','value'=>'sub_5'),

           'info' => Array('type'=>'submenu','value'=>'sub_6'),

            ),



'sub_5' => Array(

           'my' => Array('type'=>'link','value'=>'?p=5&s=1'),

         ),



'sub_6' => Array(

           'feedback' => Array('type'=>'link','value'=>'?p=6&s=1'),

           'css' => Array('type'=>'link','value'=>'?p=6&s=2'),

           'log' => Array('type'=>'link','value'=>'?p=6&s=3'),

         )

);





function fncGetSubMenu($str_menuData,$activeMenu)

{

   $strRetVal = "";

   $objData = $str_menuData[$activeMenu];



   foreach($objData as $key => $value)

   {

       $strItemType = $objData['type'];

       $strValue = $objData['value'];



       if($strItemType == 'submenu')

         {

            $strSubMenu = fncGetSubMenu($str_menuData,$strValue);

            if($strSubMenu!="") { $strRetVal .= "<LI>$strSubMenu</LI>rn";}

         }

       else

         { $strRetVal .= "<LI>$value</LI>rn"; }

   }



   if ($strRetVal<>"") { $strRetVal = "<UL>rn$strRetVal</UL>rn";}

   return $strRetVal;

}



$strMenuHTML = fncGetSubMenu($str_menuData,"header");



echo "$strMenuHTML";



?>

Lenke til kommentar


<table width="100%" cellpadding="0" cellspacing="0" align="center" border="0">

<?php

 $query="SELECT ParentID FROM Page WHERE ID=$Page";

 $row=mysql_fetch_assoc(mysql_query($query))or die("Could not find parent!");

 $Parent=$row["ParentID"];

 $query="SELECT * FROM Page WHERE ParentID=0 ORDER BY ID";

 $result=mysql_query($query);

 for ($Cnt=0; $Cnt<mysql_num_rows($result); $Cnt=$Cnt+1)

 {

   $row=mysql_fetch_assoc($result);

   if (($row["ID"]==$Parent)||($row["ID"]==$Page))

     $icon="images/open.gif";

   else

     $icon="images/book.gif";

   echo '<tr><td width="19"><img src="'.$icon.'" alt="[]"></td>';  

   echo '<td>';LinkTo($row["ID"], $row[Title]);echo'</td></tr>';

   if ($icon=="images/open.gif")

   {

     $squery="SELECT * FROM Page WHERE ParentID=".$row["ID"]." ORDER BY ID";

     $sresult=mysql_query($squery);

     for ($sCnt=0; $sCnt<mysql_num_rows($sresult); $sCnt=$sCnt+1)

     {

       $srow=mysql_fetch_assoc($sresult);

       if ($srow[ID]!=$_GET[PageID])

       {

         echo '<tr><td></td><td style="font-size: 10pt">';

         LinkTo($srow["ID"], $srow[Title]);

         echo'</td></tr>';

       }

       else

         echo '<tr><td align="right" valign="top"><font size="2">></font></td><td style="font-size: 10pt">'.$srow[Title].'</td></td>';

     };

   };    

 };

?>

</table>

 

På den annen side så har jeg alle sidene mine i en database da. :)

 

LinkTo() er en liten sak som bare lager en link til siden. Den ser slik ut:


Function LinkTo($ID, $Title)

{

 echo '<a href="index.php?PageID='.$ID.'">'.$Title.'&&</a>';

};

 

Resultatet ser dere på hjemmesiden min

Lenke til kommentar
  • 2 uker senere...
  • 2 måneder senere...

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...