Heim >Backend-Entwicklung >PHP-Tutorial >Wie kann ich mit PHP alle Dateien und Ordner in einem Verzeichnis rekursiv auflisten und dabei Endlosschleifen und doppelte Einträge vermeiden?

Wie kann ich mit PHP alle Dateien und Ordner in einem Verzeichnis rekursiv auflisten und dabei Endlosschleifen und doppelte Einträge vermeiden?

Linda Hamilton
Linda HamiltonOriginal
2024-12-02 10:05:15842Durchsuche

How Can I Recursively List All Files and Folders in a Directory Using PHP, Avoiding Infinite Loops and Duplicate Entries?

Ermitteln von Dateien und Ordnern in einem Verzeichnis mithilfe rekursiver PHP-Funktionen

Diese Diskussion untersucht eine Methode zum rekursiven Durchlaufen der Dateien und Unterverzeichnisse eines Verzeichnisses.

Die bereitgestellten Code:

function getDirContents($dir){
    $results = array();
    $files = scandir($dir);
    foreach($files as $key => $value){
        if(!is_dir($dir. DIRECTORY_SEPARATOR .$value)){
            $results[] = $value;
        } else if(is_dir($dir. DIRECTORY_SEPARATOR .$value)) {
            $results[] = $value;
            getDirContents($dir. DIRECTORY_SEPARATOR .$value);
        }
    }
}
print_r(getDirContents('/xampp/htdocs/WORK'));

Das Dilemma:
Der angegebene Code verfügt über eine rekursive Funktion zum Durchsuchen von Verzeichnissen und Dateien. Allerdings wird „.“ nicht außer Acht gelassen. und '..', was zu einer potenziell endlosen Schleife führt. Darüber hinaus wird jede Datei und jedes Verzeichnis in den Ergebnissen dupliziert.

Die Antwort:
Um dieses Problem zu beheben, können wir die Funktion wie folgt ändern:

function getDirContents($dir, &$results = array()) {
    $files = scandir($dir);
    foreach ($files as $key => $value) {
        $path = realpath($dir . DIRECTORY_SEPARATOR . $value);
        if (!is_dir($path)) {
            $results[] = $path;
        } else if ($value != "." && $value != "..") {
            getDirContents($path, $results);
            $results[] = $path;
        }
    }
    return $results;
}

Dieser Code:

  • Ruft die Funktion realpath() auf, um den tatsächlichen Pfad jeder Datei und jedes Verzeichnisses abzurufen und so jegliches Durchqueren zu verhindern Probleme.
  • Ignoriert Verzeichnisse, die mit „.“ gekennzeichnet sind. oder '..', was zu Endlosschleifen führen könnte.
  • Vermeidet doppelte Einträge in den Ergebnissen, indem sie in einem als Referenz übergebenen Array (&$results) gespeichert werden.

Das obige ist der detaillierte Inhalt vonWie kann ich mit PHP alle Dateien und Ordner in einem Verzeichnis rekursiv auflisten und dabei Endlosschleifen und doppelte Einträge vermeiden?. 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