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.