Navigation aus SQL-Datenbank erzeugen

Seven Secrets

Erfahrenes Mitglied
Hallo liebe Leute,

aus einer Datenbank mit folgendem Aufbau soll eine Navigation entstehen.

headcat | prodcat | equipcat
------------------------------------
head 1 | prod 1 | equip 1
head 1 | prod 1 | equip 2
head 1 | prod 1 | equip 3
head 1 | prod 1 | equip 4
head 1 | prod 2 | equip 1
head 1 | prod 2 | equip 2
head 1 | prod 3 | equip 1
head 1 | prod 3 | equip 2
head 2 | prod 1 | equip 1
head 2 | prod 1 | equip 2
head 2 | prod 1 | equip 3
...

Diese Navigation soll dann über Listenmodule wie folgt aussehen.

head 1
- prod 1
-- equip 1
-- equip 2
-- equip 3
-- equip 4
- prod 2
-- equip 1
-- equip 2
- prod 3
-- equip 1
-- equip 2
head 2
- prod 1
-- equip 1
-- equip 2
-- equip 3
...

Das Auslesen des Inhaltes aus der SQL-Datenbank ist nicht das Problem. Für mich ist die Frage, wie kann ich es mit Schleifen und Bedingungen lösen, dass die Navigation am Ende auch so aussieht, wie gewünscht?

Gruß, Seven
 
Beim laden der Daten eine Sortierung auf headcat, prodcat, equipcat damit du schon mal die richtige Reihenfolge hast.

Dann initialisierst du zwei Variablen $lastHead & $lastProd mit NULL.
Dann machst du eine Schleife über die Daten und vergleichst immer den head mit dem lastHead. wenn er unterschiedlich ist, beginnt ein neuer head in deinem Baum. Dasseleb macht du mit dem prod.
Nicht vergessen direkt vor dem Schleifenende $lastHead und $lastProd zu aktualisieren, damit beim nächsten Schlaufendurchgang die Daten der Letzten hast.
 
Okay, dann muß ich die Abfrage mit ASC sortieren. Etwa so.

PHP:
SELECT * FROM tabellen_name ORDER BY spalten_name ASC


Dann muß ich als nächstes eine Schleife bauen mit WHILE.

PHP:
$lastHead = 0;
$lastProd = 0;

while($count < $lastHeadl)
{
  echo $head;
  $count++;
}


Aber wie soll der Vergleich mit Head und LastHead geschehen und der Schachtelung bei der Ausgabe. Irgendwie komme ich gerade nicht hinter die Logik.
 
PHP:
//Simulation der sortierten Daten aus der DB
$nodes[] = array('headcat' => 'head 1', 'prodcat' => 'prod 1', 'equipcat' => 'equip 1');
$nodes[] = array('headcat' => 'head 1', 'prodcat' => 'prod 1', 'equipcat' => 'equip 2');
$nodes[] = array('headcat' => 'head 1', 'prodcat' => 'prod 1', 'equipcat' => 'equip 3');
$nodes[] = array('headcat' => 'head 1', 'prodcat' => 'prod 1', 'equipcat' => 'equip 4');
$nodes[] = array('headcat' => 'head 1', 'prodcat' => 'prod 2', 'equipcat' => 'equip 1');
$nodes[] = array('headcat' => 'head 1', 'prodcat' => 'prod 2', 'equipcat' => 'equip 2');
$nodes[] = array('headcat' => 'head 1', 'prodcat' => 'prod 3', 'equipcat' => 'equip 1');
$nodes[] = array('headcat' => 'head 1', 'prodcat' => 'prod 3', 'equipcat' => 'equip 2');
$nodes[] = array('headcat' => 'head 2', 'prodcat' => 'prod 1', 'equipcat' => 'equip 1');
$nodes[] = array('headcat' => 'head 2', 'prodcat' => 'prod 1', 'equipcat' => 'equip 2');
$nodes[] = array('headcat' => 'head 2', 'prodcat' => 'prod 1', 'equipcat' => 'equip 3');

$lastHeadcat = null;
$lastProdcat = null;

foreach($nodes as $node){
//var_dump($node, $lastHead, $lastProd);	
	if($node['headcat'] != $lastHeadcat){
		echo "{$node['headcat']}<br />";
		//Nach einem neuen head den prod zurücksetzen, damit er ausgegeben wird auch wenns 
		//derselbe ist wie der letzte des letzten head
		$lastProdcat = null; 
	}
	if($node['prodcat'] != $lastProdcat){
		echo "- {$node['prodcat']}<br />"; 
	}
	echo "- - {$node['equipcat']}<br />";
	$lastHeadcat = $node['headcat'];
	$lastProdcat = $node['prodcat'];
}

Ausgabe:
Code:
head 1
- prod 1
- - equip: equip 1
- - equip: equip 2
- - equip: equip 3
- - equip: equip 4
- prod 2
- - equip: equip 1
- - equip: equip 2
- prod 3
- - equip: equip 1
- - equip: equip 2
head 2
- prod 1
- - equip: equip 1
- - equip: equip 2
- - equip: equip 3
 
Sorry, dass ich mich erst jetzt wieder melde. Kinder brauchen manchmal viel Fürsorge.

Ich habe die foreach-Schleife ausprobiert, leider mit einem Fehler.

Warning: Invalid argument supplied for foreach() in navigate.php on line 15. Jedoch bin ich der Meinug, dass ich alles korrekt zusammengebaut habe.

PHP:
$result = mysql_query("SELECT * FROM ghi_prod");

$lastHeadcat = null;
$lastProdcat = null;
 
foreach($result as $node){
//var_dump($node, $lastHead, $lastProd);    
    if($node['headcat'] != $lastHeadcat){
        echo "{$node['headcat']}<br />";
        //Nach einem neuen head den prod zurücksetzen, damit er ausgegeben wird auch wenns 
        //derselbe ist wie der letzte des letzten head
        $lastProdcat = null; 
    }
    if($node['prodcat'] != $lastProdcat){
        echo "- {$node['prodcat']}<br />"; 
    }
    echo "- - {$node['equipcat']}<br />";
    $lastHeadcat = $node['headcat'];
    $lastProdcat = $node['prodcat'];
}

Oder stolper ich wieder mal über irgend eine Kleinigkeit?
 
$result ist noch kein Array
PHP:
//ersetze
foreach($result as $node){

//durch
while($node = mysql_fetch_assoc($result)){

Btw.: Du solltest aber in die Zukunft schauen und deine mysql_* durch mysqli ersetzen
 
Ich muß das hier nochmal aufmachen, weil ich an einer Bedingung scheitere, die mir nicht in den Kopf will. Ich möchte, dass die Listenelemente für diese Navigation ausgegeben werden, wobei bei letzten Punkt einer Kategorie hier dann kein abschließende </li> bekommt, sondern dies dann unter der entsprechenden Unterkategorie erzeugt wird. bisher ist der Code so:

PHP:
$result = mysql_query("SELECT * FROM ghi_prod");

$lastHeadcat = null;
$lastProdcat = null;
 
while($node = mysql_fetch_assoc($result)){
    if($node['headcat_'.$_GET[ghi_lang]] != $lastHeadcat){
    echo "<li><a href='#'>{$node['headcat_'.$_GET[ghi_lang]]}</a></li>";
	$lastProdcat = null; 
	}
	echo "<ul>";
    if($node['prodcat_'.$_GET[ghi_lang]] != $lastProdcat){
    echo "<li><a href='#'>{$node['prodcat_'.$_GET[ghi_lang]]}</a><li>";
    }
	echo "<ul>";
    if ($node['equipcat_'.$_GET[ghi_lang]] != "") {	
	echo "<li><a href='#'>{$node['equipcat_'.$_GET[ghi_lang]]}</a></li>";
	}
    $lastHeadcat = $node['headcat_'.$_GET[ghi_lang]];
    $lastProdcat = $node['prodcat_'.$_GET[ghi_lang]];
}

Wobei die Liste dann ja so aussehen soll in der Ausgabe:

HTML:
<ul><li>head 1
      <ul><li>prod 1
             <ul><li>equip 1</li>
                    <li>equip 2</li>
                    <li>equip 3</li>
                    <li>equip 4</li>
             </ul>
             </li>
             <li>prod 2
             <ul><li>equip 1</li>
                    <li>equip 2</li>
             </ul>
             </li>
             <li>prod 3
             <ul><li>equip 1</li>
                   <li>equip 2</li>
             </ul>
             </li>
      </ul>
      </li>
      <li>head 2 ....

Muß ich hier die Schleifen komplett anders gestalten?
 
Zurück