Verschwundene Array Einträge!?

CarstenS

Grünschnabel
Hallo Leute,

ich bin neu hier und auch Anfänger im Bereich PHP. Also nochmal "Hallo euch allen!".

Ich wurde im IRC auf dieses Forum aufmerksam gemacht und versuche mein Glück gleich mal hier:

Beim Programmieren einer Menü-Klasse bin ich auf ein Problem gestossen, welches ich nicht erklären kann...

Ich habe die abgespeckte Klasse und zugehörigen Zeilen mal hier angehängt. Es soll eine Menüstruktur erzeugt werden und ausgehend vom ROOT-Eintrag soll diese Struktur ausgegeben werden. Aber leider fehlen Teile bzw. Einträge der 3. Ebene.

Die Struktur sollte so aussehen
Code:
ROOT
  - TEST1
      - TEST2

TEST2 fehlt aber beim anschliessenden rekursiven Durchlaufen der Einträge.

Der Einfachheit halber mal die Ausgabe:
Code:
ROOT (has 0 entries)
===================================
Adding entry: ROOT - TEST1
ROOT (has 1 entries)
  ROOT - TEST1 (has 0 entries)
===================================
Adding entry: ROOT - TEST1 - TEST2
ROOT (has 1 entries)
  ROOT - TEST1 (has 0 entries)
===================================
Adding entry: ROOT - TEST1 - TEST2 - TEST3
ROOT (has 1 entries)
  ROOT - TEST1 (has 0 entries)

Erwarten würde ich aber, dass vor der dritten Trennlinie
Code:
  ROOT - TEST1 (has 1 entries)

und als letzte Zeile
Code:
  ROOT - TEST1 - TEST2 (has 0 entries)

ausgegeben würde.

Vielleicht übersehe ich auch nach einigen Stunden irgend etwas, aber ich sehe dort, bis auf die falsche Ausgabe, kein Problem.
Wäre schön, wenn sich das mal jemand ansehen könnte. Ich bin (beinahe) verzweifelt...

Danke im voraus
Carsten

---------------------------------------------------------------

PHP:
	require("inc/classMenu.inc.php");
	$thisMenu = new Menu;

	$thisMenu->lala();
	echo "===================================<br>";

	$x = $thisMenu->addEntry(new Menu("TEST1"));
	$thisMenu->lala();
	echo "===================================<br>";

	$y = $x->addEntry(new Menu("TEST2"));
	$thisMenu->lala();
	echo "===================================<br>";

	$z = $y->addEntry(new Menu("TEST3"));
	$thisMenu->lala();


class Menu {

	var $menuEntries;
	var $name;
	var $parent;
	var $numEntries;

	function Menu($name = "ROOT")
	{
		$this->menuEntries = array();
		$this->name = $name;
		$this->parent = null;
		$this->numEntries = 0;
	}
		

	function addEntry($menuEntry)
	{
		$menuEntry->parent = $this;
		$this->menuEntries[] = $menuEntry;
		$this->numEntries++;

		$x = $menuEntry;
		$raus = "$x->name";

		while($x = $x->parent)
		{
			$raus = "$x->name - ".$raus;
		}

		echo "Adding entry: $raus<br>";

		return $menuEntry;
	}


	function lala()
	{
		$x = $this;
		$raus = "";

		while($x = $x->parent)
		{
			$raus = "$x->name - ".$raus;
		}

		$x = $this;

		while($x = $x->parent)
		{
			$raus = "&nbsp;&nbsp;".$raus;
		}

		echo "$raus $this->name (has $this->numEntries entries)<br>";

		foreach($this->menuEntries as $entry)
		{
			$entry->lala();
		}
	}
}
 
Zuletzt bearbeitet:
Also, das ganze liegt daran, dass deine Menu-Objekte ständig kopiert werden... d.h., es gibt mehrere "Klone" von unterschiedlichen Zeitpunkten, die da irgendwo in den Objekten gespeichert sind. Die Lösung wäre hier, das ganze über Referenzen zu realisieren:
PHP:
[...]
	function addEntry(&$menuEntry)
	{
		$menuEntry->parent = &$this;
		$this->menuEntries[] = &$menuEntry;
		$this->numEntries++;

		$x = $menuEntry;
		$raus = "$x->name";
		
		while($x = $x->parent) {
			$raus = "$x->name - ".$raus;
		}
		
		echo "Adding entry: $raus<br>";
	}
[...]

$thisMenu->lala();
echo "===================================<br>";

$thisMenu->addEntry($x = new Menu("TEST1"));
$thisMenu->lala();
echo "===================================<br>";

$x->addEntry($y = new Menu("TEST2"));
$thisMenu->lala();
echo "===================================<br>";

$y->addEntry($z = new Menu("TEST3"));
$thisMenu->lala();
Eine genauere Erklärung spar ich mir lieber, dazu ist mein Hirn schon viel zu sehr in Wochendstimmung als dass ich das jetzt noch vernünftig formulieren könnte ;)
 
Hi reima,

jo, das könnts sein... Ich Hirni! In C würd ich ja auch mit Zeigern arbeiten - geil!

Wenn das funktioniert, ich bin recht zuversichtlich, dann kriegste 'nen Kuss :) Hab mehrere Stunden damit zugebracht...

Ciao
Carsten
 
Hallo reima,

nochmal ich :)

Vielen Dank für deine Hilfe, genau das war mein Problem. Mir fehlte zwar noch einige Minuten der Vertändnis-Kick im Vergeleich zu C++, aber das Problem ist gelöst und zukünftig werde ich diese Probleme nicht mehr haben.

Ciao
Carsten
 
Zurück