Map

PHP stellt mit assoziativen Arrays ein mächtiges Sprachelement zur Verfügung, das in der Map-Implementierung von Alvine um einige Aspekte konkretisiert wurde. Maps sind assoziative Arrays, deren Schlüssel immer ein String sein muss.

Implementierung

Die Klasse Map stellt eine Reihe von Methoden zur Manipulation einer Map bereit. Daneben implementiert Map auch das Iterator-, ArrayAccess- und Countable-Interface. Daher kann der Zugriff neben den Methoden $map->getValue(1) auch über ein Array Zugriff $map[1] erfolgen.

Arbeiten mit Maps

Die Beispiele durchlaufen alle Einträge der Map und rufen die entsprechende Funktion auf. Besonders in Zusammenhang mit den anonymen Funktionen lassen sich so sehr effiziente Konvertierungen durchführen.

/**
 * Eine Map erstellen und mit einem Array inititalisieren
 **/
$map = new Alvine\Types\Map(array('a'=>'Auto','b'=>'Boot','c'->'Flugzeug'));
// An jeden Wert ... hängen
$map->each(function($k, $v) { return $v.'...'; });
/**
 * Es können neben einfachen Typen auch Objekte und sogar Lambdafunktionen
 * eingehängt werden. Diese müssen einen Rückgabewert enthalten.
 */
$map->ref = function($obj) { return 4; };
$value = $map->ref; // $value hat den Wert 4;
Im folgenden Beispiel soll nur auf bestimmte Schlüssel der Map zugegriffen werden.
/**
 * Die Callback-Funktion wird auf alle Schlüssel angewendet und 
 * im Ergebnis erhält jeder Wert drei Punkte angehängt: 
 * Auto... Boot... und Flugzeug...
 */
$map = new Alvine\types\Map(array('aaa'=>'Auto','bbb'=>'Boot','ccc'=>'Flugzeug'));
$map->each(function($k, $v) { return $v.'...'; });
/**
 * Über einen optionalen Filter können Einschränkungen auf den Schlüssel 
 * angewendet werden. Im folgendne Aufruf sollen nur Schlüssel die mit a
 * beginnen verwendet werden. Ergebnis: Auto...
 */
$map->each(function($k, $v) { return $v.'...'; }, 'a');

Maps mit hierarchischen Schlüssel filtern

Maps die als Schlüssel einen Wert haben (z.B. a.b.c.d) die durch einen Punkt getrennt sind, können mittels Map::match() gefiltert werden. Die einfachste Filterung ist ein exaktes übereinstimmen. Zusätzlich kann über ein Wildcard eine oder mehrere Stufen in der Filterung übersprungen werden.

/**
 * Mehrere Schlüssel/Wert-Paare sind über hierarchische Schlüssel definiert.
 */
$map = new Alvine\types\Map(('a.x.c.d'=>'Auto', 'a.b'=>'Boot', 'a.b.c.d'=>'Flugzeug', 'a.b.e.d'=>'Schiff', 'a.e.c.d'=>'Fahrrad', 'a.b.c.d.y'=>'Kanu'));
$intersec = $map->getIntersection('a.*.*.d');
/**
 * $intersec enthält nun             
 * [a.x.c.d] => Auto
 * [a.b.c.d] => Flugzeug
 * [a.b.e.d] => Schiff
 * [a.e.c.d] => Fahrrad
 * Das Kanu und das Boot sind nicht dabei
 */

Einfache Maps

Die Klasse SimpleMap ist eine Ableitung von Map und erlauben nur einfache Typen als Wert. Wird ein Objekt oder Array zugewiesen, so wird eine TypeException geworfen.

Maps für Objekte

Die Klasse ObjectMap stellt eine Map für Objekte zur Verfügung. Wird im Konstruktor ein Klassenname übergeben, so kann die Zuweisung auf diese Klassen beschränkt werden.

$map = new ObjectMap('\Alvine\Types\StringType');
$map['a'] = new \Alvine\Types\StringType('A'); // OK
$map['a'] = new \Alvine\Types\Integer(4); // TypeException

Über die Methoden ObjectMap::etObject($object) und ObjectMap::removeObject($object) können Objekte direkt - ohne Schlüssel - hinzugefügt bzw. entfernt werden.

$map = new ObjectMap();
$map->setObject($obj)
$map->removeObject($obj)

Die Methoden sind Hilfsmethoden für ObjectMap::setValue() und ObjectMap::remove(). Als Schlüssel $key wird jeweils die ID des Objektes verwendet.