PHP: How to populate a directory structure in an array

前端 未结 4 931
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() . "<br>");
      while (false !== ($entry = $d->read())) {
         echo($entry."<br>");
      }
      $d->close();
    

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

    0 讨论(0)
  • 2021-01-06 06:08
    $ritit = new RecursiveIteratorIterator(new RecursiveDirectoryIterator(__DIR__), RecursiveIteratorIterator::CHILD_FIRST);
    $r = array();
    foreach ($ritit as $splFileInfo) {
       $path = $splFileInfo->isDir()
             ? array($splFileInfo->getFilename() => array())
             : array($splFileInfo->getFilename());
    
       for ($depth = $ritit->getDepth() - 1; $depth >= 0; $depth--) {
           $path = array($ritit->getSubIterator($depth)->current()->getFilename() => $path);
       }
       $r = array_merge_recursive($r, $path);
    }
    
    print_r($r);
    
    0 讨论(0)
  • 2021-01-06 06:08

    You could try this, where $dir is a specified path:

    function dir_tree($dir) {
       $path = '';
       $stack[] = $dir;
       while ($stack) {
           $thisdir = array_pop($stack);
           if ($dircont = scandir($thisdir)) {
               $i=0;
               while (isset($dircont[$i])) {
                   if ($dircont[$i] !== '.' && $dircont[$i] !== '..') {
                       $current_file = "{$thisdir}/{$dircont[$i]}";
                       if (is_file($current_file)) {
                           $path[] = "{$thisdir}/{$dircont[$i]}";
                       } elseif (is_dir($current_file)) {
                            $path[] = "{$thisdir}/{$dircont[$i]}";
                           $stack[] = $current_file;
                       }
                   }
                   $i++;
               }
           }
       }
       return $path;
    }
    
    0 讨论(0)
  • 2021-01-06 06:08

    I've made a gist of a build tree class. It uses RecursiveDirectoryIterator and produce an array or a JSON for ajax purpose.

    Here it is: https://gist.github.com/jonataswalker/3c0c6b26eabb2e36bc90

    0 讨论(0)
提交回复
热议问题