Heim >Backend-Entwicklung >PHP-Tutorial >Verwenden von SPR -Iteratoren, Teil 1

Verwenden von SPR -Iteratoren, Teil 1

Joseph Gordon-Levitt
Joseph Gordon-LevittOriginal
2025-02-27 10:14:10228Durchsuche

Using SPL Iterators, Part 1

Kernpunkte

  • Iteration ist ein häufiger Prozess, um eine Liste von Werten in der Programmierung zu durchqueren. In PHP ist ein Iterator ein Objekt, das eine Liste wie ein Array, eine Verzeichnisliste oder eine Datenbankergebnis -Set durchquert.
  • Die Standard -PHP -Bibliothek (SPL) bietet eine große Anzahl von Iteratoren, die den Code effizienter und lesbarer machen. Die Verwendung von SPR -Iteratoren ist besonders vorteilhaft, wenn es um große Datenmengen oder komplexe Strukturen hinausgeht, die über einfache Arrays hinausgehen.
  • Arrayiterator und RecursivearRayiterator sind zwei SPL -Iteratoren, die zur Itereration über Arrays verwendet werden. Arrayiterator wird für eindimensionale Arrays verwendet, und für mehrdimensionale Arrays wird RecursivearRayiterator verwendet.
  • DirectoryInerator und RecursiveRectoryToryIterator sind SPL -Iteratoren, die zum Durchlaufen von Verzeichnislisten verwendet werden. DirectoryInerator kann verwendet werden, um über Verzeichnisse zu iterieren, während ein rekursives DirectoryToryIterator verwendet wird, um Verzeichnisse rekursiv zu durchqueren.

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:

<code class="language-php"><?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>";
}</code>

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

Die Ausgabe des obigen Codes lautet:
<code class="language-php"><?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>";
        }
    } else {
        echo $key . ": " . $value . "<br>";
    }
}</code>

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.

<code class="language-php"><?php
...
$iter = new RecursiveArrayIterator($arr);

// 遍历对象
// 我们需要创建一个RecursiveIteratorIterator实例
foreach (new RecursiveIteratorIterator($iter) as $key => $value) {
    echo $key . ": " . $value . "<br>";
}</code>

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:

<code class="language-php"><?php
// 创建新的DirectoryIterator对象
$dir = new DirectoryIterator("/my/directory/path");

// 遍历目录列表
foreach ($dir as $item) {
    echo $item . "<br>";
}</code>

Vergessen Sie nicht, dass Sie für den DirectoryInerator und viele andere SPR -Iteratoren Ausnahmen verwenden können, um alle Fehler zu behandeln.

<code class="language-php"><?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>";
}</code>
<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:

<code class="language-php"><?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>";
        }
    } else {
        echo $key . ": " . $value . "<br>";
    }
}</code>

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:

<code class="language-php"><?php
...
$iter = new RecursiveArrayIterator($arr);

// 遍历对象
// 我们需要创建一个RecursiveIteratorIterator实例
foreach (new RecursiveIteratorIterator($iter) as $key => $value) {
    echo $key . ": " . $value . "<br>";
}</code>

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

Was ist SPS in PHP und warum ist es wichtig?

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.

Wie kann man SPR -Iterator in PHP verwenden?

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.

Was sind einige Beispiele für SPR -Iteratoren?

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);

Wie filtert ich Daten mit SPS -Iterator?

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.

Wie sortiere ich Daten mit SPS -Iterator?

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.

Was sind SPL -Ausnahmen und wie verwenden Sie sie?

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.

Wie liest und schreibe ich Dateien mit SPL?

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.

Wie kann ich SPS verwenden, um Verzeichnisse zu verarbeiten?

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.

Wie kann ich SPS verwenden, um Arrays zu verarbeiten?

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.

Wie kann ich SPS verwenden, um Datenstrukturen zu verarbeiten?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn