| SPL - Die Standard PHP Library - Unser erstes Iterator-Beispiel |
|
Seite 2 von 7
Unser erstes Iterator-BeispielDas klassische Anwendungsgebiet für Iteratoren sind Arrays. Also erstellen wir ein kleines Array, leiten ein Objekt davon ab und schauen uns an was wir damit anstellen können.
$webtechnologien = array( "PHP", "HTML", "CSS", "MySQL", "Ruby", "JavaScript", "Flash" ); $objekt = new ArrayObject( $webtechnologien ); $zeiger = $objekt->getIterator(); Unser Array habe ich jetzt mal webtechnologien genannt, unabhängig davon ob jemand mit dem Inhalt des Array nicht einverstanden ist.
Eine weitere Methode die man häufig braucht ist $objekt->count(), die einem die Anzahl der im Array befindlichen Elemente liefert. Benötigt wird das u.a. um zu wissen wie viele Schleifen-Durchläufe wir machen müssen, wie wir weiter unten noch sehen werden. Aber schauen wir uns mal die Methoden der Iterator Klasse an:
In unserem Beispiel oben ermitteln wir also mit $zeiger = $objekt->getIterator(); die Position des aktuellen Elements und übergeben diese an unseren Zeiger. Ab sofort stellt unser Zeiger ($zeiger) ein Objekt dar und wir können mit den Methoden der Klassen ArrayObject und Iterator arbeiten. Machen wir das doch einfach mal, um das etwas zu verdeutlichen: $webtechnologien = array( "PHP", "HTML", "CSS", "MySQL", "Ruby", "JavaScript", "Flash" ); $objekt = new ArrayObject( $webtechnologien ); $zeiger = $objekt->getIterator(); $zeiger->rewind(); // setzt den Zeiger an die erste Position im Array echo $zeiger->count(). "<br />"; // gibt 7 aus, da 7 Elemente in unserem Array sind echo $zeiger->current(). "<br />"; // gibt PHP aus, da sich der Zeiger auf dem ersten Element befindet $zeiger->next(); // bewegt den Zeiger zur nächsten Position if ($zeiger->valid()) // prüft ob sich der Zeiger auf einem gueltigen Element befindet. { echo $zeiger->key(). "<br />"; // gibt 1 aus, da sich der Zeiger auf dem 2. Element befindet } Soweit mal die absoluten Basics. Jeder mit etwas PHP Erfahrung wird hier nicht wirklich etwas neues gesehen haben, abgesehen davon das wir ein Array objektorientiert angesprochen haben. Einzig rewind() ist vielleicht etwas neu, aber die Funktionsweise entspricht der von reset(), die hinlänglich bekannt sein sollte. Array Iteration in der Praxis $person = array( "Vorname" => "Max", "Nachname" => "Mustermann", "Alter" => 39, "Haarfarbe" => "Braun", "Beruf" => "Rauhhaardackelzüchter" ); $PersonObjekt = new ArrayObject( $person ); $zeiger = $PersonObjekt->getIterator(); Soweit gibt's hier nichts neues zu sehen. Schauen wir uns jetzt an, wie wir an unsere Daten kommen. Als foreach()-Schleife $zeiger->rewind(); foreach ($zeiger as $schluessel => $wert) { echo $schluessel. ": " .$wert. "<br />"; } Als for()-Schleife for ($zeiger->rewind(); $zeiger->valid(); $zeiger->next()) { echo $zeiger->key(). ": " .$zeiger->current(). "<br />"; } Als while()-Schleife $zeiger->rewind(); while ($zeiger->valid()) { echo $zeiger->key(). ": " .$zeiger->current(). "<br />"; $zeiger->next(); } Wie wir sehen bleibt sich bei foreach() alles beim alten. Kein Wunder, ist doch foreach() eigentlich die Ausgabemethode für Arrays. Bei der for()-Schleife setzen wir den Zeiger auf den Array-Anfang ($zeiger->rewind()) zurück und übernehmen diese Position als Startwert für die Schleife. Als Bedingung benutzen wir hier $zeiger->valid() um zu prüfen ob die aktuelle Zeigerposition auf ein valides Array-Element zeigt. Mit $zeiger->next() legen wir den Intervall fest. Die Ausgabe ist dann Element-Schlüssel ($zeiger->key()) und der Element-Wert ($zeiger->current()). Bei der while()-Schleife müssen wir etwas aufpassen, damit wir nicht durch Nachlässigkeit eine Endlosschleife produzieren. Hier wird nämlich als Bedingung geprüft: solange $zeiger->valid() True ist, führe die Schleife aus. Deswegen ist es zwingend notwendig, daß wir innerhalb der Schleifen den Zeiger immer um eine Position nach vorn schieben ($zeiger->next()), wenn die Ausgabe erfolgt ist. Nur so können wie sicherstellen das die Bedingung irgendwann False ist - nämlich dann, wenn wir an der letzten Position im Array angekommen sind und den Zeiger "über das Ende hinaus" schieben. Alles bis hierhin war (hoffentlich) einfach nachvollziehbar. Zugegeben, einen wirklichen Durchbruch gegenüber der prozeduralen Herangehensweise ist noch nicht so ganz zu erkennen. Allerdings ist es für komplexere Aufgaben zwingend erforderlich das man den Umgang mit den Basisfunktionen beherrscht. Denn ganz gleich welche Iterator Klassen aus der SPL wir benutzen, in allen wird auf eine sehr ähnliche, bzw. identische Weise navigiert. Schauen wir uns nun ein mehr praxisbezogenes Beispiel an. |