Laravel生成目录树
在 XK-Note 项目中由于需要读取取所有文件夹和所有文件,但是 Laravel 并没有提供生成目录树的函数,所以只能自己动手丰衣足食。ㄟ( ▔, ▔ )ㄏ
Laravel 提供了一个强大的文件系统抽象,我们可以直接使用,这样就不会使目录树只支持从本地存储生成。
实现原理
Laravel 内置了 Storage::files($directory)
可以读取指定目录下的文件并生成一个索引数组, Storage::directories($directory)
可以读取指定目录下的子目录并生成索引数组,利用这两个函数就可以将指定文件夹下的所有文件和所有子文件夹的信息都存入数组中,然后可以递归提取出来的子文件夹进行深层查找,直到没有子文件夹为止,但是这样提取出来的数组会变得乱七八糟的,在生成目录列表的时候就不容易,所以要在递归的同时修改生成的索引数组。

生成的目录树结构如上,当 key 为数字时则代表 value 为文件,当 key 为字符串时则代表 value 为文件夹。
实现代码
FolderModel
_27namespace App\Http\Models;_27use Illuminate\Support\Facades\Storage;_27_27class FolderModel_27{_27 /**_27 * 获取文件夹树_27 */_27 public function get_folders($dir = "")_27 {_27 $dirs = Storage::directories($dir);_27 $dira = Storage::files($dir);_27 foreach ($dirs as $name) {_27 array_splice($dirs, 0, 1);_27 if(Storage::directories($name) == []) {_27 $dirs[$name] = Storage::files($name);_27 } else {_27 $dirs[$name] = $this->get_folders($name);_27 array_merge($dirs[$name],Storage::files($name));_27 }_27 }_27 foreach ($dira as $num => $value) {_27 $dirs[$num] = $value;_27 }_27 return $dirs;_27 }_27}
FolderController
_54amespace App\Http\Controllers;_54use App\Http\Controllers\Controller;_54use App\Http\Models\FolderModel;_54_54class FolderController extends Controller_54{_54 /**_54 * 文件夹html_54 */_54 public $out;_54 public function get_folders($dir)_54 {_54 global $out;_54 $folder = new FolderModel();_54 $arr = $folder->get_folders($dir);_54 $this->print_folders($arr, "");_54 return $out;_54 }_54 /**_54 * 将文件夹树生成html_54 * @param Array $arr 文件夹树_54 */_54 public function print_folders($arr)_54 {_54 global $out;_54 if($arr !== []) {_54 foreach ($arr as $dir => $file) {_54 if(gettype($dir) == 'integer') {_54 if(strrpos($file, '/') !== false) {_54 $file_name = substr($file, strrpos($file, '/') + 1);_54 } else {_54 $file_name = $file;_54 }_54 if(preg_match("/(.txt|.md)/i", $file_name)) {_54 $file = str_replace('uid_'.Auth::id().'/', '', $file);_54 $li_id = str_replace('.', '', $file);_54 $li_id = str_replace('/', '', $li_id);_54 $out .= '<li dir="'.$file.'" id="'.$li_id.'" class="dc"><a href="#"><i class="icon icon-file-text"></i>'.$file_name.'</a></li>';_54 }_54 } else {_54 $dir = str_replace('uid_'.Auth::id().'/', '', $dir);_54 $dir_old = $dir;_54 if(strrpos($dir, '/') !== false) {_54 $dir = substr($dir, strrpos($dir, '/') + 1);_54 }_54 $out .= '<li dir="'.$dir_old.'" class="dp"><a href="#"><i class="icon icon-folder-close"></i>'.$dir.'</a><ul>';_54 $out .= $this->print_folders($file);_54 $out .= '</ul>';_54 }_54 }_54 }_54 $out .= '</li>';_54 }_54}
Laravel生成目录树
https://blog.ixk.me/post/laravel-generating-directory-tree许可协议
发布于
2019-03-15
本文作者
Otstar Lin
转载或引用本文时请遵守许可协议,注明出处、不得用于商业用途!