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

Google Drive API PHP 递归获取文件夹内容输出非嵌套数组实现

问题根源

你当前递归逻辑中,直接将子层级递归返回的数组作为单个元素追加到了父级数组中,才会出现嵌套结构。

修复方案

有两种常用的实现方式,都可以直接输出你需要的一维数组:

方案1:合并递归返回的数组

只需要修改递归调用处的代码,将子层级返回的数组合并到当前数组即可:

// 原代码
// $files_arr[] = $this->recursivelyGetGDriveFolderContents($driveService, $files_sub);

// 修改为
$subFiles = $this->recursivelyGetGDriveFolderContents($driveService, $files_sub);
$files_arr = array_merge($files_arr, $subFiles);

方案2:引用传参存储结果(更推荐,性能更高)

直接用引用传参的全局结果数组存储所有文件/文件夹信息,不需要每次递归创建新数组再合并,修改后的完整递归函数如下:

function recursivelyGetGDriveFolderContents($driveService, $files, &$result = []){
    foreach ($files as $file) {
        $file_id = $file->getId();
        $file_name = $file->getName();
        $file_type = $file->getMimeType();
        $file_parents = $file->getParents();
        $result[] = [
            'file_name' => $file_name,
            'file_type' => $file_type,
            'file_parents' => $file_parents,
            'file_id' => $file_id,
        ];
        if($file_type == 'application/vnd.google-apps.folder'){
            $optParams = [
                'fields' => 'nextPageToken, files(id,name,mimeType,parents)',
                'q' => "'$file_id' in parents"
            ];
            $results = $driveService->files->listFiles($optParams);
            if (count($results->getFiles()) !== 0) {
                $files_sub = $results->getFiles();
                $this->recursivelyGetGDriveFolderContents($driveService, $files_sub, $result);
            } 
        }
    }
    return $result;
}

调用方式不需要修改,返回结果就是你需要的一维非嵌套结构。

优化建议

你当前请求参数中fields设置为files(*)会返回所有文件字段,你可以按需指定只返回用到的字段files(id,name,mimeType,parents),可以减少API响应体积,提升请求速度。

内容的提问来源于stack exchange,提问作者Ryan Dorn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 18:27:03