Suchen
Inside Wiki
Nützliche Links




 
phpforum.de bei Facebook
 
phpforum.de bei Twitter
 

Zurück   PHP Forum: phpforum.de > phpforum.de Wiki > phpforum.de Wiki

PHP Wiki Dieses Wiki sammelt Lösungen, zu Problemen, welche immer wieder im Forum auftauchen.

 
 
Artikel-Optionen Ansicht
  #1  

Standard SPL Iterator

 


 

OOP Design Pattern - Inhalte

Iteratoren


Die Iterator Schnittstelle ist seit PHP5 ein Teil der SPL. Es gehört zu den GoF Design Pattern.

foreach():
Foreach() wurde extra für diese Aufgabe erweitert. Iteratoen können direkt an Foreach() übergeben werden. Foreach() findet eigenständig heraus, ob das übergebene Objekt das Iterator oder das IteratorAggregate Interface implementiert und bedient es entsprechend.

So würde die Iterator Interface Deklaration aussehen, wenn sie nicht fest ins PHP eingegossen wäre.
PHP Quellcode:
interface Iterator extends Traversable
{
  function mixed current ( ); // gibt das aktuelle Element
  function scalar key (); // liefert einen Key (im Gegensatz zu Arrays muss diese Key nicht unique sein)
  function void next (); // setzt einen (wie auch immer gearteten) internen Zeiger 1 Element weiter
  function void rewind (); // Versetzt den Iterator in Startposistion (wird immer als erstes aufgerufen)
  function boolean valid (); // Prüft, ob das aktuelle Element gültig ist.
}

Zweck der Geschichte:
Iteratoren bieten eine Objekt orientierte Abstraktion auf das Problem "Mengen durchlaufen". Wenn ein Objekt einen Iterator überreicht bekommt, kann es ihm egal sein, welche Datenstruktur sich dahinter verbirgt. Das Objekt kennt das Interface und kann es bedienen.

Iteratoren vs. Arrays


Trotz vieler Ähnlichkeiten in der Verwendung, gibt es doch große Unterschiede.

Iteratoren durchlaufen ihre Menge immer von Anfang an


Wahlfreier Zugriff auf die Elemente, wie bei Arrays, ist nicht möglich.
Das bedingt auch, dass diese Mengen nicht sortierbar sind. Ebenso nicht direkt per count() zählbar.

Sortieren


Die Sortierung ist eine Eigenschaft der Menge und nicht des Iterators. Das heißt, die abzufragende Menge muß schon sortiert vorliegen.

Es muß nicht die gesammte Datenstruktur im Speicher liegen


Das dürfte der wichtigste Unterschied zum Array sein. Ein Array belegt immer für alle seine Elemente den Platz im Speicher. Ein Iterator muß das nicht.



Iteratoren in Arrays wandeln und umgekehrt


Für die eine Richtung: iterator_to_array()

Und andersrum:
PHP Quellcode:
<?php
error_reporting(-1);
ini_set('display_errors', TRUE);

$array    = array(3,6,2,6);

// interner Iterator
$iterator = new ArrayIterator($array);
if($iterator instanceof Traversable)
{
  echo "Wandlung erfolgreich.".'<br>';
  foreach($iterator as $value) echo " $value";
  echo "<hr>";
}

// Iterator aggregate
$iterator = new ArrayObject($array);
if($iterator instanceof Traversable)
{
  echo "Wandlung erfolgreich.".'<br>';
  foreach($iterator as $value) echo " $value";
  echo "<hr>";
}

?>



Iteratoren sind verkettbar


Die Filter Iteratoren sind ein sehr machtvolles Werkzeug.
Mal ein Beispiel:
Der Code soll rekursiv das aktuelle Verzeichnis nach PHP Dateien absuchen. Zusatzfeature: Eine primitive Blätterfunktion

PHP Quellcode:
<?php

error_reporting(-1);
ini_set('display_errors', TRUE);


// ------------------
// Einstellungen
$filter     = '/\.php$/i';  // regex
$such_in    = '.';   // Verzeichnis, welches durchsucht werden soll
$pro_seite  = 10;    // Anzahl Einträge pro Seite


// Pager , Blätterfunktion
$seite  = max(0,empty($_GET['S'])?0:(int)$_GET['S']);
$offset = $seite*$pro_seite;

// die Iterator Kette
$dir =  new LimitIterator(
          new RegexIterator(
            new RecursiveIteratorIterator(
              new RecursiveDirectoryIterator($such_in)),$filter),
                $offset,$pro_seite);


// Ausgabe
?> 
<h1>Seite: <?php echo  $seite   ?>     </h1>
<a href="?S=<?php echo ($seite-1)?>">Prev</a> ||
<a href="?S=<?php echo ($seite+1)?>">Next</a>
<hr>
<?php
foreach($dir as $datei)
    echo "Tiefe: ".$dir->getDepth().' '.$datei."<br>";




Links


Iteratoren im Wiki:
SPL InfiniteIterator


PHP Website:
Die SPL im PHP Handbuch
SPL Iterator im PHP Handbuch
http://www.php.net/~helly/php/ext/spl/

Wikipedia:
Iteratoren
Iterator (Entwurfsmuster)

« Vorheriges Kapitel   OOP Design Pattern
  Nächstes Kapitel »

Mitwirkende: combie, mYkon
Erstellt von combie, 21.10.2009 am 14:56
Zuletzt bearbeitet von combie, 31.10.2009 am 11:21
2 Kommentare , 8246 Betrachtungen

Dieser Text steht unter der GNU-Lizenz für freie Dokumentation


 

Lesezeichen

Stichworte
iterator, limititerator, recursive, recursiveiteratoriterator, regexiterator, rekursiv, spl

Artikel-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu
Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
SPL, Iterator: DirectoryIterator-Eintrag außerhalb von Schleife nicht ansprechbar Marc Ermshaus PHP 9 06.08.2009 20:02
implements Iterator, valid Chriz PHP 2 03.04.2009 23:17
Problem mit Iterator RcRaCk2k PHP 10 26.01.2009 01:13
Directory Iterator Problem VioletSupporter PHP 8 31.01.2006 12:25
Array: Zeiger/iterator positionieren cruzio PHP 1 10.12.2004 20:16


Alle Zeitangaben in WEZ +2. Es ist jetzt 18:56 Uhr.


Powered by vBulletin® Version 3.8.8 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Powered by NuWiki v1.3 RC1 Copyright ©2006-2007, NuHit, LLC