[英]How can I save a directory tree to an array in PHP?
我正在尝试采用以下结构的目录:
top
folder1
file1
folder2
file1
file2
并将其保存到如下数组中:
array
(
'folder1' => array('file1'),
'folder2' => array('file1', 'file2')
)
这样,我可以轻松地在整个站点中重用树。 我一直在玩这段代码,但是它仍然没有按照我想要的去做:
private function get_tree()
{
$uploads = __RELPATH__ . DS . 'public' . DS . 'uploads';
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($uploads), RecursiveIteratorIterator::SELF_FIRST);
$output = array();
foreach($iterator as $file)
{
$relativePath = str_replace($uploads . DS, '', $file);
if ($file->isDir())
{
if (!in_array($relativePath, $output))
$output[$relativePath] = array();
}
}
return $output;
}
递归函数太可怕了。 但是我设法提出了..不确定是不是你要找的东西
function tree($path, $top) {
$ignore = array('cgi-bin', '.', '..' );
$handle = opendir($path);
while( ($file = readdir($handle)) !== false ) {
if( !in_array( $file, $ignore ) ){
if( is_dir("$path/$file") ) {
$top[$file] = @ tree("$path/$file", $top[$file]);
} else {
$top[] = $file;
}
}
}
closedir( $handle );
return $top;
}
假设您的目录树是
它输出
Array
(
[a] => Array
(
[aa] => Array
(
[0] => aa.txt
)
)
[b] => Array
(
[0] => bb.txt
)
[c] => Array
(
[0] => cc.txt
)
)
但是,休息一下,观察每隔300年左右发生的一次日蚀。 当您的孩子,孙子,曾孙子问您“您知道当冬至日蚀发生时您还活着吗?”时,您不想说“不”? 你看见了吗?????”
:)
看来您没有解决$relativePath
不是目录的问题。 您没有描述您的输出,但是我想它完全由空数组组成,而没有所需的文件在里面。 这个对吗?
您需要处理到达文件而不是目录的最终情况。 自己动手刺,如果您仍在挣扎,我可以稍后再为您发布。
另外,恐怕这不会涉及更大的深度。 尽管我不确定您是否需要根据您的示例。
- 编辑 -
正如我在下面的评论中所解释的那样,这不会构建完整的树,但是根据您要查找的内容可能没问题。 一棵完整的树将进行一些更重要的更改。 但是,我在下面发布的内容至少应将文件放入文件夹中。
private function get_tree()
{
$uploads = __RELPATH__ . DS . 'public' . DS . 'uploads';
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($uploads), RecursiveIteratorIterator::SELF_FIRST);
$output = array();
foreach($iterator as $file)
{
$relativePath = str_replace($uploads . DS, '', $file);
if ($file->isDir())
{
if (!in_array($relativePath, $output))
{
$output[$relativePath] = array();
$lastDir = $relativePath;
}
}
else
{
$p = path_info($file);
$d = $p['dirname']; $f = $p['basename'];
$output[$d][] = basename($f);
}
}
return $output;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.