如何用PHP生成Fancytree所需的仅包含当前用户的文件目录树结构
修复后的实现方案
你碰到的三个问题根源和修复方法如下:
- 传参报错是因为原函数只定义了
$dir一个入参,新增用户名参数即可支持外部传入 - foreach不生效是因为原逻辑中PERSONNAL目录下的非当前用户路径直接跳过了遍历步骤,同时递归调用时多传了不存在的
$key参数导致逻辑异常 - 重复代码是因为三个分支的遍历逻辑完全一致,提前做权限过滤后只需要保留一套遍历逻辑即可
优化后的代码如下:
<?php $current_user = 'Peter'; // 调用时传入用户名即可适配不同用户 print_r(listFolders(__DIR__ . '/datausers', $current_user)); function listFolders($dir = __DIR__ . '/datausers', $name_user = 'Peter') { $dh = scandir($dir); $return = []; $personal_root = __DIR__ . '/datausers/PERSONNAL'; // 权限过滤逻辑:过滤PERSONNAL目录下其他用户的文件夹 if (strpos($dir, $personal_root) === 0) { $relative = trim(substr($dir, strlen($personal_root)), '/'); if ($relative) { $first_level = explode('/', $relative)[0]; if ($first_level !== $name_user) { return $return; } } } // 统一打印和遍历逻辑 print_r('TAKE THIS' . $dir); echo '</br>'; foreach ($dh as $item) { if ($item === '.' || $item === '..') continue; $full_path = $dir . '/' . $item; if (is_dir($full_path)) { $return[] = [ 'title' => $item, 'folder' => true, 'expanded' => true, 'children' => listFolders($full_path, $name_user) ]; } else { $return[] = [ 'title' => $item ]; } } return $return; } ?>
这套代码直接就能生成适配Fancytree的结构,只会保留当前用户有权限的目录和所有公共目录,其他用户的私人文件夹会被完全过滤。
内容的提问来源于stack exchange,提问作者Scott Meyer
相关产品推荐
相关产品推荐

