Navigation aus SQL-Datenbank erzeugen

Hallo,

ich habe jetzt sehr viel Zeit gehabt über das Problem nochmal nachzudenken, jedoch komme ich auch so nicht auf einen grünen Zweig. Wenn ich das Arry für die Navigation verwende erhalte ich keine vollständige Navigation. Ich habe es auch schon mit weiteren Schleifen und Bedingungen probiert. Die Logik will nicht in meinen Kopf und auf die Seite. Ich bitte deshalb nochmla um Hilfe.

Bisher habe ich das hier verwendet:

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 das Ergebnis mit einem Fehler behaftet ist. Es bleibt nach Produkt 1 stehen und sollte aber laut Datenbank. 2 Produktkategorieren ausspucken und die darunter enthaltenen Erweiterungen.

Ich benötige dringend einen Schubs in die richtige Richtung.
 
So, nach nun noch mehr Zeit, habe ich eine andere Lösung geschrieben. Die im Moment noch sehr langsam ist, dass ist aber ein anderes Thema. Hier die Lösung dazu:

PHP:
$resultH = mysql_query("SELECT DISTINCT headcat_".$lang." FROM ghi_prod");

while($nodeH = mysql_fetch_assoc($resultH)){
   	echo "<li><a href='#'>{$nodeH['headcat_'.$lang]}</a><ul>"; 

	$searchH = $nodeH['headcat_'.$lang];
	$resultP = mysql_query("SELECT  DISTINCT prodcat_".$lang." FROM ghi_prod WHERE headcat_".$lang." = '".$searchH."'");
	
	while($nodeP = mysql_fetch_assoc($resultP)){
   		echo "<li><a href='#'>{$nodeP['prodcat_'.$lang]}</a><ul>"; 
	
		$searchP = $nodeP['prodcat_'.$lang];
		$resultE = mysql_query("SELECT DISTINCT equipcat_".$lang." FROM ghi_prod WHERE prodcat_".$lang." = '".$searchP."'");
	
		while($nodeE = mysql_fetch_assoc($resultE)){
   			echo "<li><a href='#'>{$nodeE['equipcat_'.$lang]}</a></li>"; 
   			}   
   
 	  echo "</ul></li>";
 	  }

echo "</ul></li>";
}
 
Verschachtelte While mit eigenen SQLs bringt nix.

Du kannst eigentlich mit den Indexen der PHP-Arrays spielen.
Die Richtige Sortierung solltest du da baer bereits in der DB-Abfrage machen

PHP:
//simulierte sortierte Daten 
//ORDER BY headcat, prodcat, equipcat
$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');

//Tree mit eindeutigen Schlüssel definieren
$tree = array();
foreach($nodes as $node){
    $tree[$node['headcat']] = array('level' => 0, 'name' => $node['headcat']);
    $tree["{$node['headcat']}#{$node['prodcat']}"] = array('level' => 1, 'name' => $node['prodcat']); 
    $tree["{$node['headcat']}#{{$node['prodcat']}#{$node['equipcat']}"] = array('level' => 2, 'name' => $node['equipcat']); 
}

//Tree ausgeben
$lastLvl = -1;
foreach($tree as $item){
    //Zur besseren lesbarkeit den Array in Variablen wandeln. $le
    extract($item, EXTR_OVERWRITE);    
    //Alle offenen li und ul in den tieferen Stufen schliessen
    if($lastLvl == $level) echo '</li>';
    if($lastLvl > $level) echo '</li>'.str_repeat("</ul></li>", $lastLvl - $level);
    //ggf ein neuer ul beginnen
    if($lastLvl < $level) echo '<ul>';
    //Item ausgeben
    echo "<li>{$name}";
    //Letzter Level setzen für die nächste Runde
    $lastLvl = $level;   
}
echo '</li>'.str_repeat("</ul></li>", max($lastLvl, 0)). '</ul>';

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
		<ul>
			<li>prod 1
				<ul>
					<li>equip 1</li>
					<li>equip 2</li>
					<li>equip 3</li>
				</ul>
			</li>
		</ul>
	</li>
</ul>
 
Zurück