rekursiver iterator

08/08/2013 - 20:36 von Stefan+Usenet | Report spam
Ich habe da eine iterierbare Klasse, deren Elemente teilweise "normale"
Objekte sind, teilweise aber auch Container (haeufig vom gleichen Typ,
wie die Klasse, in der sie enthalten sind), die ihrerseits wieder
iterierbar sind.

Nun kommt jemand daher und moechte jeweils eine Property aus diesem
Gebilde in $_SESSION abspeichern. Von der Idee her also:

| foreach ($foo as $item) $_SESSION[$item->getKey()] = $item->getBar();

...nur dass mit foreach() eben dummerweise nicht alle Elemente
erreicht werden, wenn $item Unterelemente enthaelt.

Kann man das irgendwie halbwegs _elegant_ loesen (soll heissen, ohne
dass sich der aufrufende Code Gedanken um die Struktur machen muss -
den interessiert ja nur die Auflistung aller Einzelelemente)?

Servus,
Stefan

http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich
Offizieller Erstbesucher(TM) von mmeike

Stefan. Für nette Kàse, wenn der Partner laut muffelt!
(Sloganizer)
 

Lesen sie die antworten

#1 Niels Braczek
09/08/2013 - 06:11 | Warnen spam
Am 08.08.2013 20:36, schrieb Stefan Froehlich:

Ich habe da eine iterierbare Klasse, deren Elemente teilweise "normale"
Objekte sind, teilweise aber auch Container (haeufig vom gleichen Typ,
wie die Klasse, in der sie enthalten sind), die ihrerseits wieder
iterierbar sind.



Also im Wesentlichen eine Implementierung des Composite Patterns.

Nun kommt jemand daher und moechte jeweils eine Property aus diesem
Gebilde in $_SESSION abspeichern. Von der Idee her also:

| foreach ($foo as $item) $_SESSION[$item->getKey()] = $item->getBar();

...nur dass mit foreach() eben dummerweise nicht alle Elemente
erreicht werden, wenn $item Unterelemente enthaelt.



Der Ansatz ist einfach. Alle Item-Klassen sowie die Container
implementieren das Iterator-Interface. Die next()-Methode ruft solange
die next()-Methode eines Kind-Elements auf, bis dessen valid()-Methode
false lefert und geht erst dann zum nàchsten Kind-Element über. Ist ein
Kind-Element ein Item, liefert es sich beim Aufruf seiner next()-Methode
selbst zurück.

MfG
Niels

| http://barcamp-wk.de · 3. Barcamp Westküste · Frühjahr 2014 |
| http://www.bsds.de · BSDS Braczek Software- und DatenSysteme |
| Webdesign · Webhosting · e-Commerce · Joomla! Content Management |

Ähnliche fragen