Php 仅搜索和列出特定目录?
我只想搜索和列出特定的文件夹,不管这些文件夹保存得有多深 例如,下面是我如何构建它们的Php 仅搜索和列出特定目录?,php,php-5.3,scandir,Php,Php 5.3,Scandir,我只想搜索和列出特定的文件夹,不管这些文件夹保存得有多深 例如,下面是我如何构建它们的 local/ app/ master/ models/ views/ slaves/ models/ views/ scr/ models/ index.php 我只想把模型的文件夹列成一个数组 local/app/master/mo
local/
app/
master/
models/
views/
slaves/
models/
views/
scr/
models/
index.php
我只想把模型的文件夹
列成一个数组
local/app/master/models/
local/app/slaves/models/
local/models/
我的工作代码
$directories = array();
$results = array_diff( scandir("local"), array(".", "..") );
foreach ($results as $result)
{
if (is_dir("local/".$result)) {
$directories[] = $result;
}
}
var_dump($directories);
结果,
array
0 => string 'app' (length=3)
1 => string 'models' (length=6)
2 => string 'src' (length=3)
有什么想法吗?您只扫描了一层,没有检查文件夹/文件的名称。相反,您需要递归扫描。试试这样的。我还没有测试过这段代码,但是你知道了
$directories = array();
get_directories('local', $directories);
print_r($directories);
function get_directories($path, &$directories)
{
$dirs = scandir($path)
foreach($dirs as $d)
{
if(is_dir("$path/$d")
{
if($d == 'model')
$directories[] = "$path/$d";
elseif($d != '.' && $d != '..')
get_directories("$path/$d", $directories);
}
}
}
同时,如果您不需要在PHP中执行此操作,而只需查找所有目录model
,则可以使用shell命令find
:
$ find local/ -name model -type d
您只扫描了一层,没有检查文件夹/文件的名称。相反,您需要递归扫描。试试这样的。我还没有测试过这段代码,但是你知道了
$directories = array();
get_directories('local', $directories);
print_r($directories);
function get_directories($path, &$directories)
{
$dirs = scandir($path)
foreach($dirs as $d)
{
if(is_dir("$path/$d")
{
if($d == 'model')
$directories[] = "$path/$d";
elseif($d != '.' && $d != '..')
get_directories("$path/$d", $directories);
}
}
}
同时,如果您不需要在PHP中执行此操作,而只需查找所有目录model
,则可以使用shell命令find
:
$ find local/ -name model -type d
这里是另一个没有递归的解决方案,它将在PHP4和PHP5中工作
<?php
$dir ='local';
while($dirs = glob($dir . '/*', GLOB_ONLYDIR)) {
$dir .= '/*';
if (!$d) {
$d =$dirs;
} else {
$d=array_merge($d,$dirs);
}
}
$dir_to_match = 'models';
$result = array();
foreach ($d as $dir_name) {
if (preg_match('#/' . $dir_to_match . '$#', $dir_name)) {
$result[] = $dir_name;
}
}
var_dump($result);
?>
这里是另一个没有递归的解决方案,它可以在PHP4和PHP5中使用
<?php
$dir ='local';
while($dirs = glob($dir . '/*', GLOB_ONLYDIR)) {
$dir .= '/*';
if (!$d) {
$d =$dirs;
} else {
$d=array_merge($d,$dirs);
}
}
$dir_to_match = 'models';
$result = array();
foreach ($d as $dir_name) {
if (preg_match('#/' . $dir_to_match . '$#', $dir_name)) {
$result[] = $dir_name;
}
}
var_dump($result);
?>
首先创建一个包含所有目录的数组(请参阅),然后将该数组筛选为您感兴趣的条目(请参阅)。如果您只需要“模型”文件夹,为什么要使用scandir(“本地”)
而不是scandir(“本地/模型”)
?要在任何级别列出文件夹,您都需要一个递归函数。的可能重复项首先创建一个包含所有目录的数组(请参阅),然后将该数组筛选为您感兴趣的条目(请参阅)。如果您只需要“模型”下的文件夹,为什么要使用scandir(“本地”)
而不是scandir(“本地/模型”)
?要在任何级别列出文件夹,都需要一个递归函数。提示可能重复:@hakre interest-这基本上与$dir=…
行的功能相同吗?文档似乎没有建议它对basename()
做任何不同的事情-它有什么不同?很好,但是如果他有一个非常大的目录树,只有几个匹配项,那么它的内存消耗可能会非常大。if($path->isDir()&&&$path->getBasename()=='models')$result[]=(string)$path代码>-您不需要关心斜杠的类型,也不需要关心rtrimming。更清楚的是代码的作用是什么。@AleksG内存消耗来自哪里?我的理解是,RecursiveDirectoryIterator
在循环文件系统时实时读取文件系统,而不是将所有信息加载到内存中。。。这不正确吗?#提示:@hakre interest-这基本上就是$dir=…
行所做的吗?文档似乎没有建议它对basename()
做任何不同的事情-它有什么不同?很好,但是如果他有一个非常大的目录树,只有几个匹配项,那么它的内存消耗可能会非常大。if($path->isDir()&&&$path->getBasename()=='models')$result[]=(string)$path代码>-您不需要关心斜杠的类型,也不需要关心rtrimming。更清楚的是代码的作用是什么。@AleksG内存消耗来自哪里?我的理解是,RecursiveDirectoryIterator
在循环文件系统时实时读取文件系统,而不是将所有信息加载到内存中。。。这不对吗?#为什么你在2012年仍在玩这张牌?为什么你在2012年仍在玩这张牌?