mehrdimensionales Array, Rückgabewert, Rekursion

KPJHK

Grünschnabel
Schönen guten Tag,

Ich möchte eine n-dimensionale Navigation ermöglichen und habe dabei ein Problem mit einem mehrdimensionalem Array als Rückgabewert einer rekursiven Funktion.

Der Quelltext:

Code:
<?php
function test_give_navigation($kategorie,$ebene,$pid) {
	global $conf_server;
	global $conf_dbuser;
	global $conf_dbpasswort;
	global $conf_datenbank;
	global $conf_prefix;
	
	$navigationspunkte = new db($conf_server,$conf_dbuser,$conf_dbpasswort);
	$navigationspunkte -> select_db($conf_datenbank);
	$table = $conf_prefix."m_navigation_navipunkte";
	$erg_navigationspunkte= $navigationspunkte -> sql("SELECT * FROM $table WHERE kategorie = '$kategorie' AND pid = $pid ORDER BY sortierung");

	$i = 0;
	
	while($navigationspunkte = mysql_fetch_assoc($erg_navigationspunkte)) {
  $navi_array[$ebene][$i]['id'] = $navigationspunkte['id'];
  $navi_array[$ebene][$i]['pid'] = $navigationspunkte['pid'];
  $navi_array[$ebene][$i]['modul'] = $navigationspunkte['modul'];
  $navi_array[$ebene][$i]['m_site'] = $navigationspunkte['m_site'];
  $navi_array[$ebene][$i]['linktext'] = $navigationspunkte['linktext'];
  $navi_array[$ebene][$i]['required_right'] = $navigationspunkte['required_right'];
  $navi_array[$ebene][$i]['published'] = $navigationspunkte['published'];
  
  $unterpunkte = new db($conf_server,$conf_dbuser,$conf_dbpasswort);
  $unterpunkte -> select_db($conf_datenbank);
  $table = $conf_prefix."m_navigation_navipunkte";
  
  $erg_unterpunkte = $unterpunkte -> sql("SELECT * FROM $table WHERE kategorie = '$kategorie' AND pid = '".$navi_array[$ebene][$i]['id']."' ORDER BY sortierung");	
  if(mysql_num_rows($erg_unterpunkte) != 0) 
  	test_give_navigation("mainmenu",$ebene + 1,$navi_array[$ebene][$i]['id']);
  $i++;
	}

	return $navi_array;
}

$navipunkte = test_give_navigation('mainmenu',0,0);
?>
<ul>
	<li><?php echo $navipunkte[0][0]['linktext']; ?></li>
	<li><?php echo $navipunkte[0][1]['linktext']; ?>
  <ul>
  	<li><?php echo $navipunkte[1][0]['linktext']; ?></li>
  	<li><?php echo $navipunkte[1][1]['linktext']; ?></li>
  	<li><?php echo $navipunkte[1][2]['linktext']; ?></li>
  	<li><?php echo $navipunkte[1][3]['linktext']; ?>
    <ul>
    	<li><?php echo $navipunkte[2][0]['linktext']; ?></li>
    </ul>
  	</li>
  </ul>
	</li>
	<li><?php echo $navipunkte[0][2]['linktext']; ?></li>
</ul>

Erklärung:

$pid steht für $parent_id und gibt den übergeordneten Navigationspunkt des aktuellen Navigationspunktes an.
Ich initialisiere also die Funktion mit dem Wert 0 für $pid (weil das dann die 1. Ebene sein muss). Ich speichere die Daten in einen Array $navipunkte. Gleich danach überprüfe ich, ob der jeweilige Navipunkt einen oder mehrere Unterpunkte besitzt und wenn ja, rufe ich wieder die Funktion auf, um wieder alle Navipunkte der jeweiligen Ebene einzulesen.
Dies geschieht mit folgenden Zeilen:

Code:
  $unterpunkte = new db($conf_server,$conf_dbuser,$conf_dbpasswort);
  $unterpunkte -> select_db($conf_datenbank);
  $table = $conf_prefix."m_navigation_navipunkte";
  
  $erg_unterpunkte = $unterpunkte -> sql("SELECT * FROM $table WHERE kategorie = '$kategorie' AND pid = '".$navi_array[$ebene][$i]['id']."' ORDER BY sortierung");	
  if(mysql_num_rows($erg_unterpunkte) != 0) 
  	test_give_navigation("mainmenu",$ebene + 1,$navi_array[$ebene][$i]['id']);

Das Problem:

Wenn ich die Navigation ausgeben will (geschieht mit der Liste), dann stehen in dem Array $navipunkte nur die 1. Ebene. die 2. und 3. ist einfach gelöscht.
Ich habe zum Test mal direkt vor dem return, also hier:

Code:
...
return $navi_array;

einzelne Navipunkte ausgegeben, um zu überprüfen, ob eventuell beim Einlesen der Navipunkte fehler auftreten... Fehlanzeige, werden alle ordnungsgemäß ausgegeben. Aber sobald ich den Array übergebe, fehlt alles bis auf die 1. Ebene.

Jemand eine Erklärung?

Viele Grüße,
KPJHK
 
Wenn du antstatt den [code=html] Tags die [code=php] Tags benutzt, kannst du eventuelle Syntax Fehler anhand des Syntax-Highlighter sehen.
 
Ich durchblicke jetzt nicht alles auf Anhieb, aber dort, wo du das ganze rekursiv aufrufst...
PHP:
if(mysql_num_rows($erg_unterpunkte) != 0) 
 /*fehlt: "$variable =" */ test_give_navigation("mainmenu",$ebene + 1,$navi_array[$ebene][$i]['id']);
... weist du das Ergebnis das per...
PHP:
return $navi_array;
zurückkommt ja "nirgendwo hin". Als du rufst du Funktion einfach auf und das, was per return zurück kommt verschwindet irgendwohin..

Da kannst du ja leider nicht das $navi_array für $variable benutzen, weil das sonst immer wieder überschrieben wird. Vielleicht kannst du ohne return arbeiten und das $navi_array global deklarieren und dann immer reinschreiben!?
 
Zurück