Maison  >  Article  >  développement back-end  >  Comment parcourir tous les fichiers d'un répertoire en php sans récursion

Comment parcourir tous les fichiers d'un répertoire en php sans récursion

青灯夜游
青灯夜游original
2021-05-26 18:09:472139parcourir

Méthode d'implémentation : 1. Créer un tableau et mettre le répertoire à parcourir ; 2. Boucle pour traiter le tableau La condition pour la fin de la boucle est que le tableau soit vide ; traitez l'un des éléments du tableau et supprimez l'élément ; 4. Si cet élément est un répertoire, ajoutez tous les sous-éléments du répertoire au tableau, puis traitez les éléments jusqu'à ce que le tableau soit vide.

Comment parcourir tous les fichiers d'un répertoire en php sans récursion

L'environnement d'exploitation de ce tutoriel : système windows7, version PHP7.1, ordinateur DELL G3

Si vous vouloir parcourir un certain Pour tous les fichiers d'un répertoire (y compris les sous-répertoires), la première idée qui vient à l'esprit est d'utiliser la récursion : traiter d'abord le répertoire courant, puis traiter les sous-répertoires du répertoire courant. Est-ce possible sans récursion ? Je l'ai déjà vu lorsque j'étudiais les structures de données. La récursion est en fait implémentée à l'aide de la pile. La caractéristique de la récursion est qu'elle s'appelle continuellement en premier, et l'avant-dernier appel est exécuté en second. l'appel initial est le dernier à être exécuté. Si vous comprenez le principe de récursivité, vous pouvez réellement convertir toutes les implémentations récursives en implémentations non récursives.

Parcourir tous les fichiers d'un répertoire de manière non récursive L'idée se divise principalement en les étapes suivantes :

  • Créez un tableau et placez le répertoire à parcourir ; (En fait, cela crée une pile)

  • Boucle pour traiter cela array, loop La condition de fin est que le tableau soit vide

  • Chaque boucle traite un élément du tableau et supprime l'élément ;

  • Si cet élément est un répertoire, ajoutez tous les sous-éléments du répertoire au tableau, puis traitez les éléments jusqu'à ce que le tableau soit vide.

Le code écrit selon cette idée est le suivant :

<?php 

/**
 * 遍历某个目录下的所有文件
 * @param string $dir
 */
function scanAll($dir)
{
  $list = array();
  $list[] = $dir;
 
  while (count($list) > 0)
  {
    //弹出数组最后一个元素
    $file = array_pop($list);
 
    //处理当前文件
    echo $file."\r\n";
 
    //如果是目录
    if (is_dir($file))
    {
      $children = scandir($file);
      foreach ($children as $child)
      {
        if ($child !== &#39;.&#39; && $child !== &#39;..&#39;)
        {
          $list[] = $file.&#39;/&#39;.$child;
        }
      }
    }
  }
}

?>

Ici je non, je ne pense pas que la récursivité présente des inconvénients majeurs. En fait, dans de nombreux cas, l'utilisation de la récursivité pour concevoir est très concise et lisible. Quant aux problèmes d'efficacité, cela n'aura d'impact que si la profondeur de récursion est particulièrement grande.

Ce qui suit est l'implémentation récursive à des fins de comparaison :

<?php 

/**
 * 遍历某个目录下的所有文件(递归实现)
 * @param string $dir
 */
function scanAll2($dir)
{
  echo $dir."\r\n";
 
  if (is_dir($dir))
  {
    $children = scandir($dir);
    foreach ($children as $child)
    {
      if ($child !== &#39;.&#39; && $child !== &#39;..&#39;)
      {
        scanAll2($dir.&#39;/&#39;.$child);
      }
    }
  }
}

?>

On constate que les résultats des deux fonctions sont légèrement différents. Il existe des différences, principalement dans l’ordre d’impression. L'ordre des résultats d'exécution de la fonction 1 est inversé car l'ordre de poussée sur la pile est exactement l'inverse de l'ordre dans lequel scandir sort. Vous pouvez modifier la ligne 21 :

$children = array_reverse(scandir($file));
Étude recommandée. : "

Tutoriel vidéo PHP

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