Функция ниже возвращает все папки в заданном каталоге до нескольких уровней.
Мне нужна только одна глубина уровня, но только папки в целевом каталоге, никаких подпапок.
Также функция возвращает полный путь к папке, мне нужно только имя папки. Я уверен, что я пропустил что-то простое.
Как изменить функцию, чтобы возвращать только имена папок данного каталога? (не полный путь к каждой папке)
$ myArray = get_dirs ('../ wp-content / themes / mytheme / images');
<?php function get_dirs( $path = '.' ){ return glob( '{' . $path . '/*,' . # Current Dir $path . '/*/*,' . # One Level Down $path . '/*/*/*' . # Two Levels Down, etc. '}', GLOB_BRACE + GLOB_ONLYDIR ); } ?>
Кстати, благодаря Doug для оригинальной функции помощи!
Вместо использования glob()
я бы предложил использовать класс DirectoryIterator
.
function get_dirs($path = '.') { $dirs = array(); foreach (new DirectoryIterator($path) as $file) { if ($file->isDir() && !$file->isDot()) { $dirs[] = $file->getFilename(); } } return $dirs; }
Если вы хотите только иметь текущее имя папки и иметь плоский массив в обратном порядке, вы можете extend
RecursiveFilterIterator
и просто собрать стек во время RunTime при проверке, хотите ли вы accept()
его. Внутри метода accept()
вы, конечно, пропускаете все, что не имеет дочерних итераторов, поэтому вы не излишне пересекаете ненужные части.
class DirectoryStackIterator extends RecursiveFilterIterator { public static $stack = []; public function __construct( FilesystemIterator $iterator ) { parent::__construct( $iterator ); } public function getStack() { return self::$stack; } public function accept() { if ( $this->hasChildren() ) { foreach ( $this->getChildren() as $c ) { $dir = basename( $c->getPath() ); $c->isDir() && ! in_array( $dir, self::$stack ) AND self::$stack[] = $dir; } } return $this->hasChildren(); } }
Это позволяет легко определить, что именно вы хотите взамен. $c
является экземпляром SPLFileInfo
, поэтому просто ссылайтесь на это.
$iterator = new DirectoryStackIterator( new RecursiveDirectoryIterator( __DIR__, FilesystemIterator::FOLLOW_SYMLINKS | FilesystemIterator::SKIP_DOTS ) );
Затем мы присоединяем RecursiveDirectoryIterator
(который расширяет FilesystemIterator
, который затем расширяет DirectoryIterator
– чтобы узнать, какие у вас есть методы) и SKIP_DOTS
, но следуйте символическим SKIP_DOTS
. Удалите более позднюю версию, если вы этого не хотите.
Наконец, мы просто проходим через итераторы итератора, фактически ничего не делая. Имейте в виду использовать точку с запятой ( ;
) в конце, чтобы не запускать ничего на следующей строке за каждый несчастный случай.
foreach ( $iterator as $dir );
Сбор нашего пользовательского стека довольно просто:
var_dump( $iterator->getStack() );