2014-03-13 3 views
3

У меня есть сайт в настоящее время, чтобы отобразить все каталоги и подкаталоги (на MAC OS) Так что есть здесь кодRecursiveIteratorIterator - форматирование массива

$Directory = new RecursiveDirectoryIterator('/'); 
$Iterator = new RecursiveIteratorIterator($Directory); 

foreach($Iterator as $name => $object){ 
    echo "$name<br/>"; 
} 

так отзовется из всех реальной стези каталог (в настоящее время работает на среде Windows)

C:\xampp\apache\bin 
C:\xampp\apache\bin\. 
C:\xampp\apache\bin\.. 
C:\xampp\apache\bin\ab.exe 
C:\xampp\apache\bin\abs.exe 
C:\myfolder\mysubfolder 
C:\myfolder\mysubfolder\. 
C:\myfolder\mysubfolder\.. 
C:\myfolder\mysubfolder\anotherfile.php 
C:\myfolder\mysubfolder\another_folder 
C:\myfolder\mysubfolder\another_folder\. 
C:\myfolder\mysubfolder\another_folder\.. 
C:\myfolder\mysubfolder\another_folder\file.txt 

То, что я хочу сделать, это, чтобы отобразить в списке так что-то вроде:

C:\ 
    xampp\ 
     apache\ 
      bin\ 
       ab.exe 
       abs.exe 
    myfolder\ 
     mysubfolder\ 
      anotherfile.php\ 
      another_folder\ 
       file.txt 

Можно ли форматировать данные в массиве, как указано выше, а не полный путь? Я не уверен, как использовать «взрывать» и группировать их в новый массив ...?

HI снова, я попробовал этот код:

foreach($objects as $name => $object){ 
$newname=explode('\\', $name); 
print_r($newname); 
} 

и это мне дает:

array = { [0] => C:\ 
[1]=>xampp 
[2]=>apache 
[3]=>bin} 

array = { [0] => C:\ 
[1]=>xampp 
[2]=>apache 
[3]=>bin 
[4]-> . } 

array = { [0] => C:\ 
[1]=>xampp 
[2]=>apache 
[3]=>bin 
[4]=>. 
[5]=>. . } 

    array = { [0] => C:\ 
[1]=>xampp 
[2]=>apache 
[3]=>bin 
[4]=>ab.exe } 

array = { [0] => C:\ 
[1]=>xampp 
[2]=>apache 
[3]=>bin 
[4]=>abs.exe } 

Теперь, я не знаю, как цикл их так, что они отзовутся в группе например,

xampp 
    apache 
    bin 
     ab.exe 
     abs.exe 

благодаря

+0

С 'RecursiveIteratorIterator' итерации по дереву, как будто это квартира, щадящим вам информацию о глубине, это, вероятно, неправильный инструмент здесь. Вы хотите вручную рекурсивно перебирать и отслеживать глубину. – deceze

ответ

2

DirectoryIterator (+ Рекурсивная функция) может сделать это за вас.

$resutl = RecursiveDirectoryIterator(new DirectoryIterator('/path/to/dir')); 

function RecursiveDirectoryIterator(DirectoryIterator $path) 
{ 
    $data = array(); 
    foreach ($path as $node){ 
     if ($node->isDir() && !$node->isDot()){ 
      $data[$node->getFilename()] = RecursiveDirectoryIterator(new DirectoryIterator($node->getPathname())); 
     } 
     elseif ($node->isFile()){ 
      $data[] = $node->getFilename(); 
     } 
    } 
    return $data; 
} 
+0

Привет, спасибо за ваш ответ. Я пробовал свой код, путь, который я использовал, - «.» он вернет имя файла, которое находится на том же уровне, что и этот файл php, содержащий этот код. но я хочу отобразить имя файла из корня. SO Я изменил путь к «/», он возвращает пустой массив ... – user2960754

+0

@ user2960754 php не может получить доступ к «/» по умолчанию, вам нужно добавить этот путь к config_config в open_basedir, если хотите, но я этого не рекомендую. –

+0

привет @ Danial, так как я должен положить путь? Мне нужно перебрать их из корневого родительского узла (например, C: \) – user2960754

0

Здесь нерекурсивна версия, которая работает по первой сортировке итерационного результата, то, разделив количество дорожек.

<? 
$folder = "."; 
$Directory = new RecursiveDirectoryIterator($base); 
$Iterator = new RecursiveIteratorIterator($Directory); 
$SortedIterator = new SortedIterator($Iterator); 

foreach($SortedIterator as $name){ 
    // echo $name."\n"; 
    $path = explode(DIRECTORY_SEPARATOR, $name); 
    $file = array_pop($path); 
    // it's a directory 
    if ($file == ".") 
    { 
     $file = array_pop($path) . DIRECTORY_SEPARATOR; 
    } 
    if ($file === "..") 
    { 
    continue; 
    } 

    $pathcount = count($path); 
    echo str_repeat(" ", $pathcount).$file."\n"; 
} 

# Taken from example: http://stackoverflow.com/questions/2930405/sort-directory-listing-using-recursivedirectoryiterator 
class SortedIterator extends SplHeap 
{ 
    public function __construct(Iterator $iterator) 
    { 
     foreach ($iterator as $item) { 
      $this->insert($item); 
     } 
    } 
    public function compare($b,$a) 
    { 
     return strcmp($a->getRealpath(), $b->getRealpath()); 
    } 
} 

Пример вывод:

./ 
    ChangeLog 
    LICENSE.BSD 
    README.md 
    bin/ 
     phantomjs 
    example.txt 
    examples/ 
     arguments.coffee 
     arguments.js 
     child_process-examples.coffee 
     child_process-examples.js 
     colorwheel.coffee 
     colorwheel.js 
     colorwheel.png 
     countdown.coffee 
     countdown.js 
     detectsniff.coffee 
     detectsniff.js 
     direction.coffee 
     direction.js 
     echoToFile.coffee 
     echoToFile.js 
    rasterize.js 
    third-party.txt 
+0

привет, спасибо за ваш ответ. Я попробовал ваш код. но он не отображается как ваш опубликованный вывод ,,, в моем случае он выводит все файлы и подфайлы, но они находятся на одном уровне ... – user2960754

Смежные вопросы