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
相关产品推荐
相关产品推荐

