Искать только списки каталогов?

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

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

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) 

Есть идеи?

 // 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); 

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

 $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 

Вот еще одно решение без рекурсии и которое будет работать на 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); ?>