phpbar.de logo

Mailinglisten-Archive

[php] mysql und Menüs erzeugen

[php] mysql und Menüs erzeugen

Lutz Zetzsche Lutz.Zetzsche at sea-rescue.de
Mon Feb 21 15:32:51 CET 2005


Hi Ulrich,

Ulrich Wiederhold schrieb:
> Hallo,
> ich habe in einer MYSQL-Datenbank diverse Fotoalben gespeichert und sie
> soweit
> bekannt mit den Informationen "Kontinent, Land, Ort" versehen.
>
> Aus diesen Informationen möchte ich nun eine Menüstruktur erstellen, wie
> sie auf www.uli.ahrens.cx zu sehen ist. (Die Links funktionieren noch
> nicht). Hier ist alles noch manuell eingetragen.
>
> Ich verwende zumdem vlib (http://vlib.clausvb.de/), um den php-Code vom
> html-Output zu trennen.
>
> Ich habe nun die Daten in ein Array ausgelesen und über ein TMPL_LOOP im
> html-Template ausgegeben.
>
> $sql = "SELECT
>           Kontinent,
>           Land,
>           Ort
>         FROM
>           album
>         ORDER BY
>           Kontinent,
>           Land,
>           Ort";
>
> $nav_info = mysql_query($sql) OR die(mysql_error());
>
> $nav_data = array();
>
> while ($ausgabe = mysql_fetch_assoc ($nav_info)) {
>      array_push($nav_data, array(
>         'Kontinent' => $ausgabe['Kontinent'],
>         'Land' => $ausgabe['Land'],
>         'Ort' => $ausgabe['Ort']
>          )
>      );
> }
>
> $tmpl->setloop('nav_data', $nav_data);
>
>
> Das Array sieht dann wie folgt aus:
>
> Array (
>    [0] => Array (
>       [Kontinent] => Afrika
>       [Land] => Kenia
>       [Ort] =>
>       )
>    [1] => Array (
>       [Kontinent] => Afrika
>       [Land] => Kenia
>       [Ort] => Mosambike
>       )
>    [2] => Array (
>       [Kontinent] => Europa
>       [Land] => Deutschland
>       [Ort] => Köln
>       )
> )
>
> Im Template wird das ganze wie folgt ausgegeben:
> <tmpl_loop name='nav_data'>
>         <li><a href="#" class="pfeil">{tmpl_var name=Kontinent}</a>
>            <ul>
>              <li><a href="#" class="pfeil">{tmpl_var name='Land'}</a>
>              <ul>
>                <li><a href="#">{tmpl_var name='Ort'}</a></li>
>              </ul>
>              </li>
>            </ul>
>          </li>
> </tmpl_loop>
>
>
> Mein Problem ist nun:
> 1. Es gibt ein Album generell über Kenia und eines über Kenia ->
> Mosambike. Zur Zeit werden 2 Menüs generiert:
>
> Afrika - Kenia
> Afrika - Kenia - Mosambike
>
> Ich möchte aber:
> Afrika - Kenia
>        - Kenia - Mosambike
>
> und vielleicht noch Tanzania, Südafrika o.ä., ohne jeweils einen
> separaten Afrika-Eintrag. Ich möchte auch nicht mehrfache Land-Einträge,
> wenn ich z.B. in Kenia verschiedene Städte besucht habe und separate
> Alben darstellen möchte.
>
> Kann mir da jemand weiterhelfen? Muß nicht unbedingt mit dem Loop-Array
> sein. Habe es auch schon mit mehrdimensionalen Arrays versucht, komme
> aber nicht weiter.
>
> 2. (nicht ganz so dringend, klärt sich vielleicht bei der Lösung von 1)
> Wenn z.B. "Ort" nicht bekannt ist, wird trotzdem ein Feld in der
> Navigation dargestellt, allerdings ohne Inhalt. Ich möchte aber, daß in
> solch einem Fall gar kein Feld dargestellt wird.
>
> So, ich hoffe, ich konnte mich verständlich ausdrücken und es kann mir
> jemand helfen. Vielen Dank.

ich habe Dir mal ein Beispiel programmiert. Damit es verständlich bleibt,
habe ich es passend für die drei Ebenen Kontinent, Land, Ort gemacht. Das
Beispiel könnte natürlich weiter abstrahiert werden, so daß es für
beliebig viele Ebenen funktionieren würde. Wenn ich das richtig sehe,
kannst Du aber beliebig viele Ebenen schon wegen Deiner
Datenbank(tabellen)struktur nicht nutzen.


Viel Spaß mit dem unten stehenden Skript und viele Grüße :-)

Lutz



<?php

  $aInputArray  = array(
                         array('Kontinent' => 'Afrika', 'Land' => 'Kenia',
         'Ort' => ''),
                         array('Kontinent' => 'Afrika', 'Land' => 'Kenia',
         'Ort' => 'Mosambike'),
                         array('Kontinent' => 'Afrika', 'Land' =>
'Südafrika',      'Ort' => 'Johannesburg'),
                         array('Kontinent' => 'Afrika', 'Land' =>
'Südafrika',      'Ort' => 'Kapstadt'),
                         array('Kontinent' => 'Europa', 'Land' =>
'Deutschland',    'Ort' => 'Düsseldorf'),
                         array('Kontinent' => 'Europa', 'Land' =>
'Deutschland',    'Ort' => 'Köln'),
                         array('Kontinent' => 'Europa', 'Land' =>
'Deutschland',    'Ort' => 'Bonn'),
                         array('Kontinent' => 'Europa', 'Land' =>
'Frankreich',     'Ort' => 'Paris'),
                         array('Kontinent' => 'Europa', 'Land' =>
'Großbritannien', 'Ort' => 'London')
                       );

  $aOutputArray = array('Kontinente' => array(), 'Laender' => array(),
'Orte' => array());

  foreach($aInputArray as $aSubArray) {

    $sKontinent = $aSubArray['Kontinent'];
    $sLand      = $aSubArray['Land'];
    $sOrt       = $aSubArray['Ort'];

    if (!in_array($sKontinent, $aOutputArray['Kontinente'])) {
      $aOutputArray['Kontinente'][]           = $sKontinent;
      $aOutputArray['Laender'][$sKontinent]   = array();
    }
    if (!in_array($sLand, $aOutputArray['Laender'][$sKontinent])) {
      $aOutputArray['Laender'][$sKontinent][] = $sLand;
      $aOutputArray['Orte'][$sLand]           = array();
    }
    if (!empty($sOrt) && !in_array($sOrt, $aOutputArray['Orte'][$sLand])) {
      $aOutputArray['Orte'][$sLand][]         = $sOrt;
    }
  }

  echo('<pre>');
  print_r($aOutputArray);
  echo('</pre>');

  foreach($aOutputArray['Kontinente'] as $sKontinent) {
    echo('<ul><li type="square"><b>'.$sKontinent.'</b>');

    foreach($aOutputArray['Laender'][$sKontinent] as $sLand) {
      echo('<ul><li type="disc"><i>'.$sLand.'</i>');

      foreach($aOutputArray['Orte'][$sLand] as $sOrt) {
        echo('<ul><li type="circle">'.$sOrt);
        echo('</li></ul>');
      }

      echo('</li></ul>');
    }

    echo('</li></ul>');
  }

?>


php::bar PHP Wiki   -   Listenarchive