VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > PHP >
  • 分享一个生成文件层级树类

根据 php 递归读取文件夹生成文件树

  1. class Tree 
  2.  
  3.  
  4.     public $arr = array(); 
  5.  
  6.     public $icon = array
  7.  
  8.         '│'
  9.  
  10.         '├─'
  11.  
  12.         '└─' 
  13.  
  14.     ); 
  15.  
  16.     public $ret
  17.  
  18.     public function set_tree($arr = array()) 
  19.  
  20.     { 
  21.  
  22.         $this->arr = $arr
  23.  
  24.     } 
  25.  
  26.     public function get_child($myid
  27.  
  28.     { 
  29.  
  30.         $newarr = array(); 
  31.  
  32.         if (is_array($this->arr)) { 
  33.  
  34.             foreach ($this->arr as $id => $a) { 
  35.  
  36.                 if ($a['pid'] == $myid) { 
  37.  
  38.                     $newarr[$id] = $a
  39.  
  40.                 } 
  41.  
  42.             } 
  43.  
  44.         } 
  45.  
  46.         return $newarr ? $newarr : false; 
  47.  
  48.     } 
  49.  
  50.     //获取带格式数组 
  51.  
  52.     public function getArray($myid = 0, $sid = 0, $adds = ''
  53.  
  54.     { 
  55.  
  56.         $number = 1; 
  57.  
  58.         $child = $this->get_child($myid); 
  59.  
  60.         if (is_array($child)) { 
  61.  
  62.             $total = count($child); 
  63.  
  64.             foreach ($child as $a) { 
  65.  
  66.                 $j = $k = ''
  67.  
  68.                 if ($number == $total) { 
  69.  
  70.                     $j .= $this->icon[2]; 
  71.  
  72.                 } else { 
  73.  
  74.                     $j .= $this->icon[1]; 
  75.  
  76.                     $k = $adds ? $this->icon[0] : ''
  77.  
  78.                 } 
  79.  
  80.                 $spacer = $adds ? $adds . $j : ''
  81.  
  82.                 $a['name'] = $spacer . ' ' . $a['name']; 
  83.  
  84.                 $this->ret[] = $a
  85.  
  86.                 $fd = $adds . $k . '   '
  87.  
  88.                 $this->getArray($a['id'], $sid$fd); 
  89.  
  90.                 $number++; 
  91.  
  92.             } 
  93.  
  94.         } 
  95.  
  96.         return $this->ret; 
  97.  
  98.     } 
  99.  
  100.     //select 
  101.  
  102.     public function get_tree($myid$str$sid = 0, $adds = ''
  103.  
  104.     { 
  105.  
  106.         $number = 1; 
  107.  
  108.         $child = $this->get_child($myid); 
  109.  
  110.         if (is_array($child)) { 
  111.  
  112.             $total = count($child); 
  113.  
  114.             foreach ($child as $a) { 
  115.  
  116.                 $id = $a['id']; 
  117.  
  118.                 $j = $k = ''
  119.  
  120.                 if ($number == $total) { 
  121.  
  122.                     $j .= $this->icon [2]; 
  123.  
  124.                 } else { 
  125.  
  126.                     $j .= $this->icon [1]; 
  127.  
  128.                     $k = $adds ? $this->icon [0] : ''
  129.  
  130.                 } 
  131.  
  132.                 $spacer = $adds ? $adds . $j : ''
  133.  
  134.                 $select = $id == $sid ? 'selected' : ''
  135.  
  136.                 $this->ret .= sprintf($str$id$select$spacer$a['name']); 
  137.  
  138.                 $this->get_tree($id$str$sid$adds . $k . ' '); 
  139.  
  140.                 $number++; 
  141.  
  142.             } 
  143.  
  144.         } 
  145.  
  146.         return $this->ret; 
  147.  
  148.     } 
  149.  
  150.     //文件夹目录 
  151.  
  152.     public function read_all_dir($dir$onlyDir = true, $ignore = []) 
  153.  
  154.     { 
  155.  
  156.         $result = array(); 
  157.  
  158.         $handle = opendir($dir); 
  159.  
  160.         if ($handle) { 
  161.  
  162.             while (($file = readdir($handle)) !== false) { 
  163.  
  164.                 if (in_array($file$ignore)) continue
  165.  
  166.                 if ($file != '.' && $file != '..') { 
  167.  
  168.                     $cur_path = $dir . DIRECTORY_SEPARATOR . $file
  169.  
  170.                     if (is_dir($cur_path)) { 
  171.  
  172.                         $result[$file] = $this->read_all_dir($cur_path$onlyDir); 
  173.  
  174.                     } else { 
  175.  
  176.                         if (!$onlyDir) { 
  177.  
  178.                             $result[] = $file
  179.  
  180.                         } 
  181.  
  182.                     } 
  183.  
  184.                 } 
  185.  
  186.             } 
  187.  
  188.             closedir($handle); 
  189.  
  190.         } 
  191.  
  192.         return $result
  193.  
  194.     } 
  195.  
  196.     //数组转换 
  197.  
  198.     public function arrshift($array$pid = 0) 
  199.  
  200.     { 
  201.  
  202.         static $r = []; 
  203.  
  204.         static $index = 1; 
  205.  
  206.         if (is_array($array) && count($array) > 0) { 
  207.  
  208.             foreach ($array as $k => $v) { 
  209.  
  210.                 $r[] = array
  211.  
  212.                     'id' => $index
  213.  
  214.                     'pid' => $pid
  215.  
  216.                     'name' => is_array($v) ? $k : $v 
  217.  
  218.                 ); 
  219.  
  220.                 $index++; 
  221.  
  222.                 $this->arrshift($v$index - 1); 
  223.  
  224.             } 
  225.  
  226.         } 
  227.  
  228.         return $r
  229.  
  230.     } 
  231.  

使用示例

  1. $tree = new Tree (); 
  2.  
  3. //文件夹遍历 
  4.  
  5. $data = $tree->read_all_dir(realpath('../file_dir'), false, ['.git''.idea''vendor']); 
  6.  
  7. //转换成[['id','pid','name']]的二维数组 
  8.  
  9. $data = $tree->arrshift($data); 
  10.  
  11. $tree->set_tree($data);  
  12.  
  13. $data = $tree->getArray(); 
  14.  
  15. foreach ($data as $value) { 
  16.  
  17.     echo $value['name']; 
  18.  
  19.     echo '<br/>'
  20.  
  21.     echo '<br/>'
  22.  
  23. }

 

 
出处:http://www.phpfensi.com/php/20220620/21108.html

相关教程