我写了一个php function
,通过该files
我想要一个特定directories
中所有directory
和/pages (Full path - /home/ubuntu/projects/xyz.com/code/ciapp/views/pages)
|
|--file1.php
|--file2.php
|--file3.php
|--folder1
|--file4.php
|--file5.php
|--folder2
|--file6.php
|--folder3
|--file7.php
|--file8.php
的数组。
1)以下是我的目录结构 -
array
2)我想要的是files and directories
Array
(
[files] => Array
(
[0] => /home/ubuntu/projects/xyz.com/code/ciapp/views/pages/file1.php
[1] => /home/ubuntu/projects/xyz.com/code/ciapp/views/pages/file2.php
[2] => /home/ubuntu/projects/xyz.com/code/ciapp/views/pages/file3.php
[3] => /home/ubuntu/projects/xyz.com/code/ciapp/views/pages/folder1/file4.php
[4] => /home/ubuntu/projects/xyz.com/code/ciapp/views/pages/folder1/file5.php
[5] => /home/ubuntu/projects/xyz.com/code/ciapp/views/pages/folder1/folder2/file6.php
[6] => /home/ubuntu/projects/xyz.com/code/ciapp/views/pages/folder3/file7.php
[7] => /home/ubuntu/projects/xyz.com/code/ciapp/views/pages/folder3/file8.php
)
[directories] => Array
(
[0] => /home/ubuntu/projects/xyz.com/code/ciapp/views/pages/folder1
[1] => /home/ubuntu/projects/xyz.com/code/ciapp/views/pages/folder1/folder2
[2] => /home/ubuntu/projects/xyz.com/code/ciapp/views/pages/folder3
)
)
-
Array
(
[files] => Array
(
[0] => /home/ubuntu/projects/xyz.com/code/ciapp/views/pages/file1.php
[1] => /home/ubuntu/projects/xyz.com/code/ciapp/views/pages/file2.php
[2] => /home/ubuntu/projects/xyz.com/code/ciapp/views/pages/file3.php
)
[directories] => Array
(
[0] => /home/ubuntu/projects/xyz.com/code/ciapp/views/pages/folder1
[1] => /home/ubuntu/projects/xyz.com/code/ciapp/views/pages/folder3
)
)
3)我得到的东西(只有1级) -
function get_files_directories($directory, $a = array())
{
$dirs = scandir($directory, 1);
$arr = $a;
foreach($dirs as $dir)
{
if($dir != "." && $dir != '..')
{
$new_dir = $directory.'/'.$dir;
if(is_dir($new_dir))
{
$arr['directories'][] = $new_dir;
get_files_directories($new_dir, $arr);
}
else
{
$arr['files'][] = $new_dir;
}
}
}
return $arr;
}
$my_dir = "/home/ubuntu/projects/xyz.com/code/ciapp/views/pages";
$files_dirs = get_files_directories($my_dir);
echo '<pre>'; print_r($files_dirs);
4)我的功能 -
{{1}}
我在这里错过了什么?帮助将不胜感激。谢谢你:)
答案 0 :(得分:4)
使用您的路径切换$path
,这应该有效。 SPL包含递归目录遍历所需的所有类,不需要自己滚动。
<?php
$path = '.';
$result = array('files' => array(), 'directories' => array());
$DirectoryIterator = new RecursiveDirectoryIterator($path);
$IteratorIterator = new RecursiveIteratorIterator($DirectoryIterator, RecursiveIteratorIterator::SELF_FIRST);
foreach ($IteratorIterator as $file) {
$path = $file->getRealPath();
if ($file->isDir()) {
$result['directories'][] = $path;
} elseif ($file->isFile()) {
$result['files'][] = $path;
}
}
print_r($result);
有关详细信息,请参阅PHP文档:RecursiveDirectoryIterator,RecursiveIteratorIterator&amp; SplFileInfo是很好的起点!
答案 1 :(得分:1)
使用FilesystemIterator
可能会更快一点:
function getDirectoryList($dir) {
$dirList = $fileList = array();
$iter = new FilesystemIterator($dir, FilesystemIterator::SKIP_DOTS);
foreach($iter as $file) {
if($file->isDir()) {
$dirList[$file->getFilename()] = getDirectoryList($file->getPathname());
} else {
$fileList[$file->getFilename()] = $file->getFilename();
}
}
uksort($dirList, "strnatcmp");
natsort($fileList);
return $dirList + $fileList;
}
此函数将为您提供一个与目录结构完全相同的多维数组,也可以更容易使用。
答案 2 :(得分:0)
它是递归调用,您可以将返回值附加到数组或 处理数组引用:
if(is_dir($new_dir))
{
$arr['directories'][] = $new_dir;
get_files_directories($new_dir, $arr); //assign or return
}
-
function get_files_directories($directory, &$arr)
答案 3 :(得分:0)
您应该指定从重复调用返回的“arr”,或者您应该通过引用传入数组。 (参见参考文献:http://php.net/manual/en/language.references.pass.php)
通过引用传递:get_files_directories($ new_dir,&amp; $ arr);