Maison >développement back-end >tutoriel php >Comment puis-je répertorier de manière récursive tous les fichiers et dossiers d'un répertoire à l'aide de PHP, en évitant les boucles infinies et les entrées en double ?

Comment puis-je répertorier de manière récursive tous les fichiers et dossiers d'un répertoire à l'aide de PHP, en évitant les boucles infinies et les entrées en double ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-02 10:05:15842parcourir

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

Détermination des fichiers et des dossiers dans un répertoire à l'aide de fonctions PHP récursives

Cette discussion étudie une méthode permettant de parcourir les fichiers et sous-répertoires d'un répertoire de manière récursive.

Le fourni 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'));

Le dilemme :
Le code donné possède une fonction récursive pour explorer les répertoires et les fichiers. Cependant, il ne parvient pas à ignorer « ». et '..', ce qui entraîne une boucle potentiellement sans fin. De plus, chaque fichier et répertoire est dupliqué dans les résultats.

La réponse :
Pour résoudre ce problème, nous pouvons modifier la fonction comme suit :

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

Ce code :

  • Appelle la fonction realpath() pour récupérer le chemin réel de chaque fichier et répertoire, éliminant ainsi toute traversée potentielle problèmes.
  • Ignore les répertoires désignés par '.' ou '..', ce qui pourrait conduire à des boucles infinies.
  • Évite les entrées en double dans les résultats en les stockant dans un tableau passé par référence ($results).

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn