использование glob для возврата списка папок в заданном каталоге (без путей) - PullRequest
2 голосов
/ 15 декабря 2009

Функция ниже возвращает все папки в данном каталоге до нескольких уровней.

Мне нужна глубина только одного уровня, только папки в целевом каталоге, без подпапок.

Также функция возвращает полный путь к папке, мне нужно только имя папки. Я уверен, что упускаю что-то простое.

Как я могу изменить функцию, чтобы она возвращала только имена папок данного каталога? (не полные пути к каждой папке)

$ 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 );
  }
?>

Кстати, спасибо Дугу за оригинальную справку по функциям!

Ответы [ 2 ]

5 голосов
/ 15 декабря 2009

Вместо использования glob() я бы предложил использовать DirectoryIterator класс.

function get_dirs($path = '.') {
    $dirs = array();

    foreach (new DirectoryIterator($path) as $file) {
        if ($file->isDir() && !$file->isDot()) {
            $dirs[] = $file->getFilename();
        }
    }

    return $dirs;
}
0 голосов
/ 28 января 2014

Если вам нужно только имя текущей папки и получить плоский массив взамен, вы можете extend a 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, но следуйте символическим ссылкам. Удалите последний, если вы этого не хотите.

Наконец, мы просто проходим через итераторы итераторов, фактически ничего не делая. Не забывайте использовать точку с запятой (;) в конце, чтобы ничего не вызывать на следующей строке в случае аварии.

foreach ( $iterator as $dir );

Собрать наш пользовательский стек довольно просто:

var_dump( $iterator->getStack() );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...