Искать и перечислять только определенные каталоги? - PullRequest
0 голосов
/ 15 февраля 2012

Я хочу искать и перечислять только определенные папки, и независимо от того, насколько глубоко они хранятся.

Например, ниже приведен порядок их структурирования,

local/
     app/
        master/
             models/
             views/
        slaves/
             models/
             views/
     scr/
     models/
     index.php

И я простохотите перечислить папку models в массив,

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)

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 15 февраля 2012

Вы сканируете только на один уровень глубины и не проверяете имя папки / файла.Вместо этого вам нужно будет сканировать рекурсивно.Попробуйте что-то вроде этого.Я не проверял этот код - но вы поняли.

$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, выэто можно легко сделать с помощью команды оболочки find:

$ find local/ -name model -type d
1 голос
/ 15 февраля 2012

Вот еще одно решение без рекурсии, которое будет работать как в php 4, так и в php 5

<?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);
?>
1 голос
/ 15 февраля 2012
// Create an object that allows us to iterate directories recursively
// Stolen from here: 
// http://www.php.net/manual/en/class.recursivedirectoryiterator.php#102587
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir),
                                          RecursiveIteratorIterator::CHILD_FIRST);

// This will hold the result
$result = array();

// Loop the directory contents
foreach ($iterator as $path) {

  // If object is a directory and matches the search term ('models')...
  if ($path->isDir() && $path->getBasename() === 'models') {

    // Add it to the result array
    $result[] = (string) $path;

  }

}

print_r($result);
...