Kernpunkte
Ich fühlte mich ein wenig überfordert, als ich mit dem Begriff "Iteration" in Kontakt kam und die zahlreichen Kategorien in SPL gesehen habe. Die Iteration scheint zu kompliziert, um sie zu verstehen. Aber ich erkannte bald, dass es sich nur um eine wunderschöne Operationsaussage handelte, die wir Programmierer durchgeführt haben. Wenn Sie PHP verwenden, haben Sie wahrscheinlich Arrays verwendet. Wenn Sie ein Array verwendet haben, haben Sie definitiv seine Elemente iteriert. Wenn Sie sich jeden Code ansehen, können Sie mit ziemlicher Sicherheit die foreach
-Slober finden. Ja, Iteration ist nur ein Prozess, in dem die Werteliste durchquert wird. Ein Iterator ist ein Objekt, das eine Liste durchquert, die ein Array, eine Verzeichnisliste oder sogar ein Datenbankergebnissatz sein kann. Im ersten Teil dieser Serie werde ich Ihnen Iterationen vorstellen und wie man einige der integrierten Kurse in der Standard-PHP-Bibliothek (SPL) nutzt. SPS enthält eine große Anzahl von Iteratoren, die sie in Ihrem Code verwenden können, um die Code -Effizienz zu verbessern und den Code in den meisten Fällen lesbarer zu machen.
Wann und warum SPL -Iterator
verwenden Wie Sie sehen werden, sind iterative Iteratorobjekte im Grunde genommen die gleichen wie iterative Arrays, so viele Menschen möchten wissen, ob es am Anfang einfacher ist, sich an Arrays zu halten. Der wahre Vorteil der Iteratoren besteht jedoch darin, große Datenmengen oder komplexere Daten zu durchqueren als einfache Arrays. Die foreach
-Sloop kopiert ein an ihm übergebenes Array. Wenn Sie an einer großen Datenmenge arbeiten, kopieren Sie sie jedes Mal, wenn Sie ein großes Array in einer Schleife verwenden, was möglicherweise nicht wünschenswert ist. Der SPR -Iterator verkauft die Liste und enthüllt die Sichtbarkeit von jeweils nur ein Element, was sie effizienter macht. Iteratoren sind ein gutes Konstrukt beim Erstellen von Datenanbietern, da Sie die Ladedaten verzögern können. Lazy Loading hier ruft bei Bedarf nur die erforderlichen Daten ab. Sie können auch die Daten manipulieren (filtern, konvertieren usw.), bevor sie dem Benutzer zur Verfügung gestellt werden. Die Entscheidung, den Iterator zu verwenden, liegt jedoch immer in Ihrem Ermessen. Iteratoren haben viele Vorteile, aber in einigen Fällen (z. B. kleinere Array -Sets) kann dies zu unnötigem Overhead führen. Wenn Sie sie verwenden, müssen Sie Ihre Stilauswahl und ihre Anwendbarkeit in einer bestimmten Situation berücksichtigen. foreach
Iterationsarray
Der erste Iterator, den ich Ihnen vorstellen möchte, ist Arrayiterator. Der Konstruktor nimmt ein Array als Argument an und bietet Methoden, mit denen es verwendet werden kann, um es zu durchqueren. Hier ist ein Beispiel:
<?php // 一个数组(使用PHP 5.4的新简写法) $arr = ["sitepoint", "phpmaster", "buildmobile", "rubysource", "designfestival", "cloudspring"]; // 创建一个新的ArrayIterator并传入数组 $iter = new ArrayIterator($arr); // 遍历对象 foreach ($iter as $key => $value) { echo $key . ": " . $value . "<br></br>"; }
Die Ausgabe des obigen Codes lautet:
<code>0: sitepoint 1: phpmaster 2: buildmobile 3: rubysource 4: designfestival 5: cloudspring</code>
Normalerweise verwenden Sie ArrayObject (eine Klasse, mit der Sie Objekte in bestimmten Kontexten als Arrays verarbeiten können), anstatt Arrayiterator direkt zu verwenden. Wenn Sie einen foreach
-Sloop oder Anruf Arrayiterator :: getiterator () direkt verwenden, wird automatisch einen Arrayiterator für Sie erstellt. Beachten Sie, dass ArrayObject und Arrayiterator sich in diesem Zusammenhang wie Arrays verhalten, aber immer noch Objekte sind. Arrayiterator ist einfach zu bedienen, jedoch nur für eindimensionale Arrays. Manchmal haben Sie ein mehrdimensionales Array und möchten rekursiv durch das verschachtelte Array iterieren. In diesem Fall können Sie RecursivearRayIterator verwenden. Ein häufiges Szenario besteht darin, sort()
Loops zu nisten oder eine rekursive Funktion zu erstellen, um alle Elemente in einem mehrdimensionalen Array zu überprüfen. Zum Beispiel: array_keys()
foreach
<?php // 一个多维数组 $arr = [ ["sitepoint", "phpmaster"], ["buildmobile", "rubysource"], ["designfestival", "cloudspring"], "not an array" ]; // 遍历对象 foreach ($arr as $key => $value) { // 检查数组 if (is_array($value)) { foreach ($value as $k => $v) { echo $k . ": " . $v . "<br></br>"; } } else { echo $key . ": " . $value . "<br></br>"; } }
Eine elegantere Art und
<code>0: sitepoint 1: phpmaster 0: buildmobile 1: rubysource 0: designfestival 1: cloudspring 3: not an array</code>
Die Ausgabe ist die gleiche wie im vorherigen Beispiel. Beachten Sie, dass Sie hier eine RecursivIterator -Instanz erstellen und an das RecurSiveArRayIterator -Objekt weitergeben müssen. Andernfalls erhalten Sie nur die Werte im Stammarray (und viele Benachrichtigungen, die basierend auf Ihren Einstellungen erzeugt werden). Wenn Sie mit mehrdimensionalen Arrays arbeiten, sollten Sie RecursivearRayIterator verwenden, da Sie den aktuellen Eintrag durchführen können, aber es hängt davon ab, dass Sie es selbst tun. RecursivEderatoriterator ist ein Dekorateur, der dies für Sie tut. Es nimmt den RecursivearRayiterator, iteriert ihn und iteriert über alle fundierbaren iterablen Einträge (und so weiter). Im Wesentlichen "flats" es den RecursivearRayiterator. Sie können die Tiefe der aktuellen Iteration für die Verfolgung erhalten, indem Sie RecursivIteratorIterator :: GetDepth () aufrufen. Wenn Sie jedoch ein Objekt zurückgeben möchten, achten Sie darauf, dass RecursivearRayIterator und RecursivEderatoriterator als iterbar sind und daher iteriert werden.
<?php ... $iter = new RecursiveArrayIterator($arr); // 遍历对象 // 我们需要创建一个RecursiveIteratorIterator实例 foreach (new RecursiveIteratorIterator($iter) as $key => $value) { echo $key . ": " . $value . "<br></br>"; }
Iterationsverzeichnisliste
Sie müssen zweifellos irgendwann über das Verzeichnis und seine Dateien iterieren, und Sie können dies mit integrierten Funktionen von PHP (z. B. oder
) tun, aber Sie können auch den Directoryiterator verwenden. In seiner einfachsten Form ist Directoryiterator sehr leistungsfähig, kann aber auch unterklassifiziert und verbessert werden. Hier ist ein Beispiel für die Iterierung über Verzeichnisse mit dem DirectoryInator:
scandir()
glob()
Die Ausgabe hängt offensichtlich von dem von Ihnen angegebenen Pfad und dem Inhalt des Verzeichnisses ab. Zum Beispiel:
<?php // 创建新的DirectoryIterator对象 $dir = new DirectoryIterator("/my/directory/path"); // 遍历目录列表 foreach ($dir as $item) { echo $item . "<br></br>"; }
Vergessen Sie nicht, dass Sie für den DirectoryInerator und viele andere SPR -Iteratoren Ausnahmen verwenden können, um alle Fehler zu behandeln.
<?php // 一个数组(使用PHP 5.4的新简写法) $arr = ["sitepoint", "phpmaster", "buildmobile", "rubysource", "designfestival", "cloudspring"]; // 创建一个新的ArrayIterator并传入数组 $iter = new ArrayIterator($arr); // 遍历对象 foreach ($iter as $key => $value) { echo $key . ": " . $value . "<br></br>"; }
<code>0: sitepoint 1: phpmaster 2: buildmobile 3: rubysource 4: designfestival 5: cloudspring</code>
Verwenden Sie viele andere Methoden wie DirectoryIterator :: isdot (), DirectoryInator :: GettType () und DirectoryIterator :: GetSize (), fast alle Ihre grundlegenden Verzeichnisinformationen. Sie können sogar DirectoryInerator mit Filteriterator oder Regexiterator kombinieren, um Dateien zurückzugeben, die mit einer bestimmten Bedingung übereinstimmen. Zum Beispiel:
<?php // 一个多维数组 $arr = [ ["sitepoint", "phpmaster"], ["buildmobile", "rubysource"], ["designfestival", "cloudspring"], "not an array" ]; // 遍历对象 foreach ($arr as $key => $value) { // 检查数组 if (is_array($value)) { foreach ($value as $k => $v) { echo $k . ": " . $v . "<br></br>"; } } else { echo $key . ": " . $value . "<br></br>"; } }
spl liefert auch einen rekursiven Anbieter, der genauso verwendet wird wie der RecursivearRayIterator. Funktionen, die rekursiv Verzeichnisse rekursiv durchlaufen, enthalten häufig viele bedingte Überprüfungen zur Überprüfung gültiger Verzeichnisse und Dateien, während ein rekursives DirektoryIterator die meiste Arbeit für Sie erledigen kann, was zu einem saubereren Code führt. Es gibt jedoch eine Warnung. RecursivedirectoryIterator gibt kein leeres Verzeichnis zurück.
<code>0: sitepoint 1: phpmaster 0: buildmobile 1: rubysource 0: designfestival 1: cloudspring 3: not an array</code>
Meine Ausgabe ähnelt:
<?php ... $iter = new RecursiveArrayIterator($arr); // 遍历对象 // 我们需要创建一个RecursiveIteratorIterator实例 foreach (new RecursiveIteratorIterator($iter) as $key => $value) { echo $key . ": " . $value . "<br></br>"; }
Zusammenfassung
Ich hoffe, Sie erkennen jetzt, dass die Iteration nicht so kompliziert ist, wie ich es anfänglich dachte, es ist etwas, was wir programmierer jeden Tag tun. In diesem Artikel habe ich Iteration und einige der von SPS bereitgestellten Klassen eingeführt, um die Iteration einfacher und robuster zu machen. Natürlich befasse ich mich nur mit einem kleinen Teil der Proben der verfügbaren Klassen. SPS ist eine "Standard" -Bibliothek. Manchmal finden Sie diese Klassen zu allgemein und sie erfüllen möglicherweise nicht immer Ihre Bedürfnisse. In diesem Fall können Sie diese Klassen problemlos erweitern, um Ihre eigene Funktionalität hinzuzufügen oder die vorhandene Funktionalität bei Bedarf anzupassen. Im nächsten Teil dieser Serie zeige ich Ihnen, wie Sie die SPL -Schnittstelle verwenden, um Ihre eigenen benutzerdefinierten Klassen zu erstellen, die wie ein Array durchquert und zugegriffen werden können. Bilder von Mushakesa / Shutterstock
FAQs über die Verwendung von SPR -Iteratoren
spl stand für die Standard -PHP -Bibliothek. Es handelt sich um eine Reihe von Schnittstellen und Klassen, um häufige Probleme zu lösen. SPS liefert viele Datenstrukturen, Schnittstellen und Ausnahmen, mit denen komplexe Aufgaben effizienter umgehen können. Dies ist wichtig, da es dazu beitragen kann, die Menge an Code zu verringern, die Sie zum Schreiben benötigen, die Leistung verbessern und Ihren Code leichter zu lesen und zu warten.
SPL -Iterator wird verwendet, um Datensätze zu iterieren. Um einen SPL -Iterator zu verwenden, müssen Sie zunächst eine Instanz der Iteratorklasse erstellen. Sie können dann die Sammlung mit der Methode des Iterators durchführen. Beispielsweise können Sie die current()
-Methode verwenden, um das aktuelle Element zu erhalten, die next()
-Methode zum nächsten Element zu wechseln und die valid()
-Methode zu überprüfen, um zu überprüfen, ob mehr Elemente zum ITERATION vorhanden sind.
Es gibt viele verschiedene Arten von SPR -Iteratoren, die jeweils für einen bestimmten Zweck ausgelegt sind. Einige Beispiele sind Arrayiterator (zum Iterieren über Arrays);
Sie können Daten mit der Filteriteratorklasse filtern. Mit dieser Klasse können Sie einen benutzerdefinierten Filter definieren, der für jedes Element in der Sammlung gilt. Nur Artikel, die durch den Filter fahren, werden vom Iterator zurückgegeben.
Sie können die Daten mithilfe der ArrayObject -Klasse sortieren. Diese Klasse bietet eine asort()
-Methode zum Sortieren von Elementen in einer Sammlung. Sie können auch die Methode uasort()
verwenden, um Elemente mithilfe der benutzerdefinierten Vergleichsfunktion zu sortieren.
SPL -Ausnahme ist ein Ausnahmetyp, der speziell für SPL ausgelegt ist. Sie bieten eine Möglichkeit, Fehler zu behandeln, die bei der Verwendung von SPL auftreten. Um die SPL -Ausnahme zu verwenden, werfen Sie sie einfach in den try
-Block und fangen sie in den catch
-Block.
Sie können mit der SplafileObject -Klasse Dateien lesen und schreiben. Diese Klasse bietet Methoden zum Öffnen, Lesen, Schreiben und Schließen von Dateien. Es bietet auch Methoden zum Verschieben von Dateizeiger und zur Überprüfung, ob das Ende der Datei erreicht wurde.
Sie können die DirectoryInator -Klasse verwenden, um Verzeichnisse zu verarbeiten. Diese Klasse bietet Methoden zum Öffnen eines Verzeichnisses, zum Lesen seiner Inhalte und zum Schließen eines Verzeichnisses. Es enthält auch Methoden zum Überprüfen, ob eine Datei ein Verzeichnis ist, und um die Größe, den Typ und die Änderungszeit der Datei zu erhalten.
Sie können ArrayObject- und Arrayiterator -Klassen verwenden, um Arrays zu verarbeiten. Diese Klassen bieten Methoden zum Erstellen eines Arrays, zum Hinzufügen von Elementen, zum Entfernen von Elementen und zum Iterieren seiner Elemente. Sie bieten auch Methoden zum Sortieren von Arrays und Überprüfung, ob Elemente im Array vorhanden sind.
Sie können die verschiedenen von SPS bereitgestellten Datenstrukturklassen verwenden, um Datenstrukturen zu verarbeiten. Diese Klassen umfassen Splstack, Splqueue, Splheap und Splpriorityqueue. Jede Klasse bietet Methoden zum Erstellen einer Datenstruktur, zum Hinzufügen von Elementen, zum Entfernen von Elementen und zum Iterieren der Elemente.
Das obige ist der detaillierte Inhalt vonVerwenden von SPR -Iteratoren, Teil 1. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!