3.3. Baumstrukturen

Hierarchische Datenstrukturen lassen sich unter anderem durch Baumstrukturen darstellen, d.h. ein Element kann mehrere untergeordnete Elemente ("Kinder") und genau ein übergeordnetes Element ("Vater") haben. Elemente, die kein übergeordnetes Element haben, also auf der obersten Ebene der Hierarchie angeordnet sind, werden als "Wurzeln" bezeichnet, Elemente, die keine "Kinder" haben, als "Blätter".
Im GREYHOUND Server sind beispielsweise die Gruppen und Themen in solchen Hierarchien organisiert.
Um solche Baumstrukturen abzubilden und die Arbeit damit zu vereinfachen, stellt die PHP API die Hilfsklasse GhCoreTree bereit. Ein Objekt vom Typ GhCoreTree repräsentiert eine Baumstruktur. Die Methode "add()" erlaubt das Hinzufügen von Wurzelelementen, die Methode "addChild()" das Hinzufügen von Elementen als Kinder zu bestehenden Elementen des Baums.
Intern verwendet der Baum für jedes Element eine ID, die über alle Elemente des Baums eindeutig sein muss. Diese ID kann entweder eine Zahl (Integer) oder eine Zeichenkette sein. Beim Hinzufügen eines Elements mit "add()" muss eine solche ID festgelegt werden. Als weiterer Parameter muss eine Beschriftung oder Bezeichnung für das Element angegeben werden. Diese Beschriftung wird beispielsweise von der PHP GUI bei der Anzeige eines Baums in grafischen Komponenten verwendet. Zusätzlich können als dritter Parameter noch optional Daten am Baumelement hinterlegt werden. Diese Daten können ein beliebiges Format haben. Komplexere Daten können beispielsweise als Array oder Objekt hinzugefügt werden.
Beim Hinzufügen von Kindelementen über die Methode "addChild()" wird ebenfalls als erster Parameter die ID des Elements im Baum festgelegt. Als zweiter Parameter wird hier die ID des übergeordneten Elements (des "Vaters") angegeben, unter dem das Element in die Hierarchie eingeordnet werden soll. Die restlichen Parameter geben die Beschriftung und optional die Daten an.
Die Methoden zum Hinzufügen von Elementen liefern das neu erzeugte Baumelement als Ergebnis zurück. Um die ID, die Beschriftung und ggf. die Daten zu speichern, verwendet der Baum intern Objekte des Typs GhCoreTreeNode. Diese bieten Methoden zum Abfragen und Setzen der ID ("getId()", "setId()"), der Beschriftung ("getCaption()", "setCaption()") sowie der optionalen Daten ("getData()", "setData()"). Auch bieten diese Objekte eine eigene Methode "add()" über die analog zur Methode des GhCoreTree Kindelemente zu diesem Baumelement hinzugefügt werden können. Hier entfällt die Angabe der ID des übergeordneten Elements, da diese ja in dem Objekt, das dieses Element repräsentiert, bereits vorliegt. Die Methode "getChildren()" der Baumelemente liefert einen Array mit allen Baumelementen zurück, die diesem Element als "Kinder" untergeordnet sind.
Die Methode "get()" des GhRpcTree liefert entsprechend ein Baumelement (vom Typ GhCoreTreeNode) anhand seiner ID. Die Methode "getIds()" liefert einen Array mit den IDs aller Elemente, die im Baum vorhanden sind, die Methode "getList()" liefert einen Array aller Baumelemente. Wie auch die Baumelemente verfügt der Baum selbst ebenfalls über eine Methode "getChildren()", die in diesem Fall die Wurzelelemente des Baums zurück liefert.
Das folgende Beispiel zeigt das Erzeugen eines Baums und das Ausgeben der Elemente. Hier werden beide Möglichkeiten zum Hinzufügen von Kindelementen gezeigt (entweder über die Methode "addChild()" des Baums, oder über die Methode "add()" eines Baumelements).
Erzeugen und Ausgeben einer Baumstruktur:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?php
require_once 'ghrpc/ghrpc.php'// oder 'ghgui/ghgui.php'

// Erzeugen des Baums:
$tree = new GhRpcTree();

$tree->add('a100''Alpha'); // Wurzelelement
$tree->addChild('a110''a100''A 1'); // Kindelement
$tree->addChild('a120''a100''A 2'); // Kindelement
$tree->addChild('a121''a120''A 2a'); // Kindelement des Kindelements

$beta $tree->add('b100''Beta'); // Wurzelement
$beta->add('b110''B 1'); // Kindelement
$b2 $beta->add('b120''B 2'); // Kindelement
$b2->add('b121''B 2a'); // Kindelement des Kindelements

$tree->add('c100''Gamma''Datenstring'); // Wurzeleement
$tree->addChild('c110''c100''Details', array('name' => 'Thorsten Tester''email' => 'thorsten.tester@mailinator.com')); // Kindelement

// Hilfsfunktion für das Ausgeben von Baumelementen:
function printTreeNode($treeNode)
{
  echo 
'<li>';
  echo 
$treeNode->getCaption() . ' (ID: ' $treeNode->getId();

  if(
$treeNode->getData())
    echo 
', Daten: ' var_export($treeNode->getData(), true);

  echo 
')';

  
$children $treeNode->getChildren();

  if(!empty(
$children))
  {
    echo 
'<ul>';

    foreach(
$children as $childNode)
      
printTreeNode($childNode);

    echo 
'</ul>';
  }

  echo 
'</li>';
}

// Ausgeben des Baums:
echo 'Inhalt des Baums:<br><br>';
echo 
'<ul>';

foreach(
$tree->getChildren() as $rootNode)
  
printTreeNode($rootNode);

echo 
'</ul>';
Die Klasse GhRpcTree der PHP RPC Bibliothek ist eine spezialisierte Ableitung der Klasse GhCoreTree, die eine Liste von Daten des GREYHOUND Servers in eine Baumstruktur überführen kann, beispielsweise die Liste der Gruppen oder der Themen.