Heim > Backend-Entwicklung > PHP-Problem > So durchlaufen Sie alle Dateien in einem Verzeichnis in PHP ohne Rekursion

So durchlaufen Sie alle Dateien in einem Verzeichnis in PHP ohne Rekursion

青灯夜游
Freigeben: 2023-03-09 22:50:02
Original
2150 Leute haben es durchsucht

Implementierungsmethode: 1. Erstellen Sie ein Array und legen Sie das zu durchlaufende Verzeichnis ab. 2. Schleife zum Verarbeiten des Arrays. Die Bedingung für das Ende der Schleife ist, dass das Array leer ist 4. Wenn dieses Element ein Verzeichnis ist, fügen Sie alle Unterelemente im Verzeichnis zum Array hinzu und verarbeiten Sie die Elemente, bis das Array leer ist.

So durchlaufen Sie alle Dateien in einem Verzeichnis in PHP ohne Rekursion

Die Betriebsumgebung dieses Tutorials: Windows 7-System, PHP-Version 7.1, DELL G3-Computer

Wenn Sie alle Dateien in einem Verzeichnis (einschließlich Unterverzeichnissen) durchsuchen möchten, ist dies die erste Idee, die Ihnen in den Sinn kommt Der Sinn besteht darin, Rekursion zu verwenden: Verarbeiten Sie zuerst das aktuelle Verzeichnis und dann die Unterverzeichnisse unter dem aktuellen Verzeichnis. Ist es ohne Rekursion möglich? Ich habe es schon einmal gesehen, als ich Datenstrukturen studiert habe. Das Merkmal der Rekursion ist, dass sie sich selbst kontinuierlich aufruft und der vorletzte Aufruf dann ausgeführt wird. Der erste Aufruf ist der letzte, der ausgeführt wird. Wenn Sie das Prinzip der Rekursion verstehen, können Sie tatsächlich alle rekursiven Implementierungen in nicht rekursive Implementierungen umwandeln.

Alle Dateien in einem Verzeichnis nicht rekursiv durchlaufen. Die Idee ist hauptsächlich in die folgenden Schritte unterteilt:

  • Erstellen Sie ein Array und legen Sie das zu durchlaufende Verzeichnis ab Array-Stack)

  • Schleife zum Verarbeiten dieses Arrays. Die Bedingung für das Ende der Schleife ist, dass das Array leer ist.

  • In jeder Schleife wird ein Element im Array verarbeitet und das Element gelöscht.

  • Wenn es sich bei diesem Element um ein Verzeichnis handelt, fügen Sie alle Unterelemente im Verzeichnis zum Array hinzu und verarbeiten Sie die Elemente dann, bis das Array leer ist.

Der nach dieser Idee geschriebene Code lautet wie folgt:

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

?>
Nach dem Login kopieren

Ich glaube nicht, dass die Rekursion hier große Mängel aufweist. Tatsächlich ist die Verwendung der Rekursion zum Entwerfen in vielen Fällen immer noch sehr prägnant und lesbar. Was Effizienzprobleme betrifft, wird es nur dann Auswirkungen haben, wenn die Rekursionstiefe besonders groß ist.

Das Folgende ist die Implementierung unter Verwendung der Rekursion zum Vergleich:

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

?>
Nach dem Login kopieren

Es wurde festgestellt, dass die Ergebnisse der beiden Funktionen geringfügig unterschiedlich sind, hauptsächlich in der Reihenfolge des Druckens. Die Reihenfolge der laufenden Ergebnisse von Funktion 1 ist umgekehrt, da die Reihenfolge des Verschiebens auf den Stapel genau das Gegenteil der Reihenfolge ist, in der Scandir ausgegeben wird. Sie können Zeile 21 ändern:

$children = array_reverse(scandir($file));
Nach dem Login kopieren

Empfohlenes Lernen: „PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt vonSo durchlaufen Sie alle Dateien in einem Verzeichnis in PHP ohne Rekursion. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage