HierarchicalString

Viele Daten liegen als hierarchische Informationen vor. So z.B. die Nummerierung von Kapiteln, oder von Aufzählungslisten.

Implementierung

Die Klasse \Alvine\Types\HierarchicalString stellt eine bequeme Möglichkeit zum Arbeiten mit hierarchischen Zeichenketten dar. Als Beispiel haben wir eine Zeichenkette a.b.c.d die jeweils reduziert und erweitert werden soll.

/**
 * Neues Objekt erstellen
 */
$string = new \Alvine\Types\HierarchicalString('a.b.c.d');

/**
 * Durch alle Teile laufen und diese Ausgeben
 */
foreach($string AS $sub) {
    echo $sub."::";
}

// Ausgabe: a::b::c::d::

/**
 * Über die Methoden addChild und removeChild läßt sich
 * die Struktur einfach bearbeiten.
 */
echo ((string)$string)."\n";                     // Zeichenkette ausgeben  a.b.c.d
echo ((string)$string->parent())."\n";           // Eine Ebene nach oben   a.b.c
echo ((string)$string->addChild('1.2.3'))."\n";  // 3 Ebenen ergänzen      a.b.c.1.2.3  
echo ((string)$string->addChild('4.'))."\n";     // Eine weitere Ebene     a.b.c.1.2.3.4      (Wichtig: der letzte Punkt wird nicht mit ausgegeben)
echo ((string)$string->parent(3))." \n";         // Drei Ebenen nach oben  a.b.c.1

// Anderes Trennzeichen setzen
$string->setSeparator('::');
echo (string)$string;                 // Ausgabe a::b::c::1

Vergleichen von zwei Zeichenketten

Die Methode HierarchicalString::match() erlaubt es zwei Zeichenketten zu vergleichen. Dies ist insbesondere mit den zur Verfügungstehenden Wildcards ein mächtiges Werkzeug zur Auswertung von Eigenschaften.

/**
 * Diese Methode erlaubt es, einen hierarchischen String mit 
 * einem anderen String zu vergleichen und auch ein Wildcard *
 * einzusetzen. Werden zwei Sterne als letzte Zeichen angegeben **
 * so wird auch TRUE zurückgegeben, wenn der Ursprungsstring
 * länger als der Vergleichsstring ist.
 **/

$stringA = new HierarchicalString('a.b.c.d');
$stringB = new HierarchicalString('a.b.c.d');
$flag = !$stringA->match($stringB));   // TRUE, da der Filterwert $stringB mit $stringA übereinstimmt.

$stringB = new HierarchicalString('a.b.c.d.g');
$flag = !$stringA->match($stringB));   // FALSE, da der Filterstring länger ist.

// Einsatz von Wildcards
$stringA = new HierarchicalString('a.b.c.d');
$stringB = new HierarchicalString('*.b.*.d');
$flag = $stringA->match($stringB);   // TRUE, da die Wildcards für jeden Wert stehen

$stringB = new HierarchicalString('*.b.*.d.*');
$flag = $stringA->match($stringB);   // FALSE, da der Wildcards zu lang ist.

$stringB = new HierarchicalString('*.b');
$flag = $stringA->match($stringB);   // FALSE, nicht gleiche Länge.

// Wildcard für beliebige Länge
$stringB = new HierarchicalString('a.**');
$flag = $stringA->match($stringB);   // TRUE
Ein Sonderfall tritt ein, wenn beide Strings leer sind. In diesem Fall wird per Definition TRUE zurückgegeben.
$stringA = new HierarchicalString('');
$stringB = new HierarchicalString('');
$this->assertTrue($stringA->match($stringB));   // TRUE, beide identisch leer