PHP: How to populate a directory structure in an array

前端 未结 4 930
Happy的楠姐
Happy的楠姐 2021-01-06 05:43

I am developing an admin panel that shows the directory structure of a specific location on server. I have got a recursive php function that iterates through every file and

4条回答
  •  一生所求
    2021-01-06 05:45

    This class to grab files and directories recursive (= incl. subdirs) by putting the paths in a single, usable array will give you a good headstart:

      class myRecursiveDirectoryParser
      {
         protected $currentPath;
         protected $slash;
         protected $rootPath;
         protected $recursiveTree;
    
         function __construct($rootPath,$win=false)
         {
            switch($win)
            {
               case true:
                  $this->slash = '\\';
                  break;
               default:
                  $this->slash = '/';
            }
            $this->rootPath = $rootPath;
            $this->currentPath = $rootPath;
            $this->recursiveTree = array(dir($this->rootPath));
            $this->rewind();
         }
    
         function __destruct()
         {
            $this->close();
         }
    
         public function close()
         {
            while(true === ($d = array_pop($this->recursiveTree)))
            {
               $d->close();
            }
         }
    
         public function closeChildren()
         {
            while(count($this->recursiveTree)>1 && false !== ($d = array_pop($this->recursiveTree)))
            {
               $d->close();
               return true;
            }
            return false;
         }
    
         public function getRootPath()
         {
            if(isset($this->rootPath))
            {
               return $this->rootPath;
            }
            return false;
         }
    
         public function getCurrentPath()
         {
            if(isset($this->currentPath))
            {
               return $this->currentPath;
            }
            return false;
         }
    
         public function read()
         {
            while(count($this->recursiveTree)>0)
            {
               $d = end($this->recursiveTree);
               if((false !== ($entry = $d->read())))
               {
                  if($entry!='.' && $entry!='..')
                  {
                     $path = $d->path.$entry;
    
                     if(is_file($path))
                     {
                        return $path;
                     }
                     elseif(is_dir($path.$this->slash))
                     {
                        $this->currentPath = $path.$this->slash;
                        if($child = @dir($path.$this->slash))
                        {
                           $this->recursiveTree[] = $child;
                        }
                     }
                  }
               }
               else
               {
                  array_pop($this->recursiveTree)->close();
               }
            }
            return false;
         }
    
         public function rewind()
         {
            $this->closeChildren();
            $this->rewindCurrent();
         }
    
         public function rewindCurrent()
         {
            return end($this->recursiveTree)->rewind();
         }
      }
    

    Next up comes an example of how to use the class. In your case, you would have to walk the data, use "explode('/')" in the loop and construct a new array as you've described above.

      $d = new myRecursiveDirectoryParser("./",false);
      echo($d->getRootPath() . "
    "); while (false !== ($entry = $d->read())) { echo($entry."
    "); } $d->close();

    All you need to do is get busy. You're almost done when you take it from here. ;)

提交回复
热议问题