Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 仅搜索和列出特定目录?_Php_Php 5.3_Scandir - Fatal编程技术网

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年仍在玩这张牌?