Baumstruktur in PHP *verzweifel*

Beffo38

Fleet Captain Special
Mitglied seit
24.08.2002
Beiträge
295
Renomée
4
  • SIMAP Race
  • QMC Race
Hallo zusammen

Ich programmiere derzeit eine Baum-Datenstruktur in PHP 4. Unter Java habe ich sowas schon unzählige Male gemacht, aber unter PHP stolpere ich über die Geschichte mit den Referenzen, und wäre deshalb ein wenig Hilfestellung sehr dankbar.

Ok, worum geht's? Ich habe eine Klasse Baum. Jede Instanz hat einen Wert, also eine Beschriftung, und eine Menge von Kindern, die ebenfalls Instanzen der Klasse Baum sind. Schema F aus der Informatik halt.

Ich habe neben dem Konstruktor, der einen Baumknoten anlegt und die Beschriftung festlegt, noch eine Methode zum hinzufügen von Kindern, und eine zum rekursiven anzeigen eines Knotens und seiner Kinder.

PHP:
<?php

class Baum {
	
	var $wert;		//Beschriftung des Knotens	
	var $kinder;	//Array mit Kindern

	//Konstruktor
    function baum($wert) {
    	$this->wert = $wert;
    	$this->kinder = array();
    }
    
    //Kind hinzufügen
    function addKind(&$kind) {
    	$kinder[] =& $kind;
    }
    
    //Knoten eingerückt anzeigen, Kinder rekursiv anzeigen
    function zeige($einrueck = 0) {
    	
    	for ($i = 0; $i < $einrueck; $i++)
    		echo '-';
    	
    	echo $this->wert.'<br />';
    	
    	foreach($kinder as $kind)
    		$kind->zeige($einrueck + 2);
    		
    }
}

//Beispieldaten

$a =& new Baum('a');
$b =& new Baum('b');
$c =& new Baum('c');
$d =& new Baum('d');
$e =& new Baum('e');

$a->addKind(&$b);
$a->addKind(&$c);
$b->addKind(&$d);
$b->addKind(&$e);

$a->zeige();

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

?>

Problem: Das Array $kinder will einfach nicht die Verweise auf die Kinder korrekt abspeichern, wie die Ausgabe zeigt:

Code:
a

baum Object
(
    [wert] => a
    [kinder] => Array
        (
        )

)

Es wird nur der erste Knoten (die Wurzel) angezeigt. Und print_r zeigt, dass das Kinder-Array dieses Knotens auch leer ist. Irgendwie verzweifle ich an der Geschichte mit den Referenzen.

Die korrekte Ausgabe müsste so sein:
Code:
a
--b
----d
----e
--c

Hat jemand eine Idee, wie obiger Code verändert werden müsste, damit er korrekt funktioniert. Ich jedenfalls bin mit meinem Latein am Ende.
 
Ok, Leutz, Kardinalsfehler. Statt $kinder muss es $this->kinder heißen.

Kleiner unauffälliger Fehler mit großer Wirkung :-[ .

Jedenfalls geht's jetzt *puhh*.
 
Zurück
Oben Unten