【发布时间】:2015-07-29 11:55:52
【问题描述】:
我正在尝试编写一个脚本来读取目录并创建一个多维数组,其结构和内容与文件系统上的结构相同。
过去我只是运行了一个遍历目录并将键设置为完整路径并将值设置为在该路径中找到的文件的脚本。这一次,这样的数组不会那么容易使用了。
我使用那个旧脚本来获取我正在使用的文件结构:
Array
(
[0] => files/example
[1] => files/example/2015
[2] => files/example/2015/Documents
[3] => files/example/2015/Documents/Catalogs
[4] => files/example/2015/Documents/Manuals
[5] => files/example/2015/Documents/Press-Releases
[6] => files/example/2015/Documents/Sell-Sheets
[7] => files/example/2015/Email-Templates
[8] => files/example/2015/Email-Templates/HTML-Templates
[9] => files/example/2015/Email-Templates/Outlook-Templates
[10] => files/example/2015/Email-Templates/Template-Image-Files
[11] => files/example/2015/Images
[12] => files/example/2015/Images/Ads-and-Flyers
[13] => files/example/2015/Images/Catalog-and-PoP-Graphics
[14] => files/example/2015/Images/Files-for-Web
[15] => files/example/2015/Images/High-Resolution-Files
[16] => files/example/2015/Images/Lifestyle-Shots
[17] => files/example/2015/Images/Logos-and-Brand-Identity
[18] => files/example/2015/Images/Product-Images
[19] => files/example/2015/Images/Vector-Files
[20] => files/example/2015/Other-Files
)
最终/files 下会有更多文件夹,/files 的每个子文件夹内会有多年。
在我的搜索中,我发现有人提出了将单个路径转换为多维数组的方法,但我无法成功地使这些方法适应我的情况。有些部分起作用,有些根本不起作用。最接近我想要的方式是使用以下代码:
function getfiles($path,&$files){
if(($h = opendir($path))){
$args = explode('/',$path);
$folder = array_pop($args);
if(!isset($files[$folder])) $files[$folder] = array();
while(($file = readdir($h)) !== false){
$check = $path . '/' . $file;
// directory
if(is_dir($check)){
if(!in_array($file,array('.','..'))){
getfiles($check, $files[$folder]);
}
// file
}else if(!is_dir($check)){
$files[$folder][] = $file;
}
}
}
}
很遗憾,这并不完全正确。它给了我这个:
Array(
[example] => Array(
[2015] => Array(
[Documents] => Array(
[Press-Releases] => Array()
[Sell-Sheets] => Array()
[Catalogs] => Array()
[Manuals] => Array()
)
[Images] => Array(
[Lifestyle-Shots] => Array()
[Files-for-Web] => Array()
[High-Resolution-Files] => Array()
[Product-Images] => Array()
[Catalog-and-PoP-Graphics] => Array()
[Ads-and-Flyers] => Array()
[Vector-Files] => Array()
[Logos-and-Brand-Identity] => Array()
)
[Other-Files] => Array()
[Email-Templates] => Array(
[Outlook-Templates] => Array()
[Template-Image-Files] => Array()
[HTML-Templates] => Array()
)
)
)
[2015] => Array(
[Documents] => Array(
[Press-Releases] => Array()
[Sell-Sheets] => Array()
[Catalogs] => Array()
[Manuals] => Array()
)
[Images] => Array(
[Lifestyle-Shots] => Array()
[Files-for-Web] => Array()
[High-Resolution-Files] => Array()
[Product-Images] => Array()
[Catalog-and-PoP-Graphics] => Array()
[Ads-and-Flyers] => Array()
[Vector-Files] => Array()
[Logos-and-Brand-Identity] => Array()
)
[Other-Files] => Array()
[Email-Templates] => Array(
[Outlook-Templates] => Array()
[Template-Image-Files] => Array()
[HTML-Templates] => Array()
)
)
[Documents] => Array(
[Press-Releases] => Array()
[Sell-Sheets] => Array()
[Catalogs] => Array()
[Manuals] => Array()
)
[Catalogs] => Array()
[Manuals] => Array()
[Press-Releases] => Array()
[Sell-Sheets] => Array()
[Email-Templates] => Array(
[Outlook-Templates] => Array()
[Template-Image-Files] => Array()
[HTML-Templates] => Array()
)
[HTML-Templates] => Array()
[Outlook-Templates] => Array()
[Template-Image-Files] => Array()
[Images] => Array(
[Lifestyle-Shots] => Array()
[Files-for-Web] => Array()
[High-Resolution-Files] => Array()
[Product-Images] => Array()
[Catalog-and-PoP-Graphics] => Array()
[Ads-and-Flyers] => Array()
[Vector-Files] => Array()
[Logos-and-Brand-Identity] => Array()
)
[Ads-and-Flyers] => Array()
[Catalog-and-PoP-Graphics] => Array()
[Files-for-Web] => Array()
[High-Resolution-Files] => Array()
[Lifestyle-Shots] => Array()
[Logos-and-Brand-Identity] => Array()
[Product-Images] => Array()
[Vector-Files] => Array()
[Other-Files] => Array()
)
如您所见,它为每个文件夹创建了一个根数组键,而不是仅仅停留在示例文件夹中。
我确定我的函数有一个简单的逻辑错误导致了这种情况,但要么我离它太近而没有注意到它,要么我的大脑不再与我合作。
或者这不是我想做的事情的正确方法。
提前感谢您提供的任何帮助。
【问题讨论】:
标签: php arrays multidimensional-array