已创建关联数组时函数外无法传递完整数组,需将目录转为指定关联数组
解决PHP中目录遍历关联数组无法在函数外部完整获取的问题
看起来你是在遍历指定目录结构构建关联数组时,遇到了函数外部无法拿到完整数组的问题对吧?结合你给出的目录结构,我给你两个可行的解决方案,都能帮你生成想要的格式:
方案一:递归函数返回合并后的数组
这个方案通过递归遍历每个目录,把当前目录作为键加入数组,再合并子目录的结果,最后完整返回整个数组:
function buildFolderArray($dir) { $result = []; // 将当前目录路径作为键,值设为空数组 $result[$dir] = []; // 打开目标目录 $handle = opendir($dir); if (!$handle) { return $result; } // 遍历目录内的所有内容 while (($file = readdir($handle)) !== false) { // 跳过系统默认的.和..目录 if ($file == '.' || $file == '..') { continue; } $fullPath = $dir . DIRECTORY_SEPARATOR . $file; // 如果是子目录,递归处理并合并结果 if (is_dir($fullPath)) { $result = array_merge($result, buildFolderArray($fullPath)); } } closedir($handle); return $result; } // 调用函数,传入你的根目录路径 $rootDirectory = 'C:/xampp/htdocs/rosoka/file'; $finalFolderArray = buildFolderArray($rootDirectory); // 按照你想要的格式输出每个数组项 foreach ($finalFolderArray as $folderPath => $emptyArray) { echo "Array ( [$folderPath] => Array ( ))\n"; }
方案二:使用引用传递数组
如果你更习惯通过修改外部变量的方式来构建数组,可以用引用传递的方式,让函数直接修改外部的数组变量:
function buildFolderArray($dir, &$resultArray) { // 把当前目录加入结果数组 $resultArray[$dir] = []; $handle = opendir($dir); if (!$handle) { return; } while (($file = readdir($handle)) !== false) { if ($file == '.' || $file == '..') { continue; } $fullPath = $dir . DIRECTORY_SEPARATOR . $file; if (is_dir($fullPath)) { // 递归处理子目录,直接修改外部传入的数组 buildFolderArray($fullPath, $resultArray); } } closedir($handle); } // 初始化空数组 $finalFolderArray = []; $rootDirectory = 'C:/xampp/htdocs/rosoka/file'; // 传入数组的引用 buildFolderArray($rootDirectory, $finalFolderArray); // 输出指定格式的结果 foreach ($finalFolderArray as $folderPath => $emptyArray) { echo "Array ( [$folderPath] => Array ( ))\n"; }
为什么之前拿不到完整数组?
大概率是你之前的函数没有正确返回数组,或者没有用引用传递的方式更新外部变量。上面的两个方案都解决了这个问题:要么让函数把每次递归的结果合并后返回,要么直接通过引用修改外部数组,这样在函数外部就能拿到包含所有目录路径作为键的完整关联数组了。
内容的提问来源于stack exchange,提问作者fakhryan albar
相关产品推荐
相关产品推荐

