You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PHP生成Fancytree所需的仅包含当前用户的文件目录树结构

修复后的实现方案

你碰到的三个问题根源和修复方法如下:

  1. 传参报错是因为原函数只定义了$dir一个入参,新增用户名参数即可支持外部传入
  2. foreach不生效是因为原逻辑中PERSONNAL目录下的非当前用户路径直接跳过了遍历步骤,同时递归调用时多传了不存在的$key参数导致逻辑异常
  3. 重复代码是因为三个分支的遍历逻辑完全一致,提前做权限过滤后只需要保留一套遍历逻辑即可

优化后的代码如下:

<?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 09:21:04