Я хочу сделать RecursiveDirectoryIterator в наборе папок в каталоге, например ./temp
а затем перечислить файлы в каждой папке в соответствии с именем папки.
Например, у меня есть папки A
и B
В A у меня есть список файлов: 1.txt
, 2.php
, 2.pdf
, 3.doc
, 3.pdf
.
В B у меня есть 1.pdf
, 1.jpg
, 2.png
.
Я хочу, чтобы мои результаты были такими:
A => List of files in A B => List of files in B
Как это может быть сделано?
<?php $scan_it = new RecursiveDirectoryIterator("./temp"); foreach(new RecursiveIteratorIterator($scan_it) as $file =>$key) { $filetypes = array("pdf"); $filetype = pathinfo($file, PATHINFO_EXTENSION); if (in_array(strtolower($filetype), $filetypes)) { $dlist=basename($file); //sort ?> <ul> <li> <?php echo substr(dirname($file),11);?> </li> <li> <a href="<?php echo $file;?>"><?php echo basename($file);?></a> </li> </ul> <?php }} ?>
Используйте комбинацию RecursiveDirectoryIterator
и RecursiveIteratorIterator
для перебора всех подкаталогов.
Ниже приведенный ниже фрагмент будет делать то, что вам нужно, хотя он ограничен только созданием массива с одним массивом в глубину … это делается для того, чтобы избежать попадания в рекурсивный беспорядок в рамках небольшого фрагмента, который уже запутался в процедурных мозгах.
$array = array(); foreach ($iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator("./temp", RecursiveDirectoryIterator::SKIP_DOTS), RecursiveIteratorIterator::SELF_FIRST) as $item) { // Note SELF_FIRST, so array keys are in place before values are pushed. $subPath = $iterator->getSubPathName(); if($item->isDir()) { // Create a new array key of the current directory name. $array[$subPath] = array(); } else { // Add a new element to the array of the current file name. $array[$subPath][] = $subPath; } } }
//Managed to put this together and it somehow works for me. If you have other options please provide. Thanks $path='./temp'; $dir = new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::SKIP_DOTS); $files = new RecursiveIteratorIterator($dir, RecursiveIteratorIterator::CHILD_FIRST); foreach ($files as $file=>$mykey) { if(is_dir($file)) { $directory = $file; $mydir = new RecursiveIteratorIterator(new RecursiveRegexIterator(new RecursiveDirectoryIterator($directory,RecursiveDirectoryIterator::FOLLOW_SYMLINKS), // match both pdf file extensions and directories '#(?<!/)\.pdf$|^[^\.]*$#i'),true); foreach ($mydir as $myfile=>$mykey) { $result[] = $myfile.'<br />'; $filetypes = array("pdf"); $filetype = pathinfo($myfile, PATHINFO_EXTENSION); if (in_array(strtolower($filetype), $filetypes)) { // output all matches substr(dirname($file),11) ?> <div><h3<?php echo count($result);?>> <span><?php echo substr(PHP_EOL . $directory . PHP_EOL . PHP_EOL,13);?></span></h3></div> <?php if (!empty($mydir)) { foreach ($mydir as $d) { if (strpos($d->getFilename(), '.pdf') !== FALSE) {?> <div><ul><li><a href="<?php echo $d;?>"><?php echo basename($d->getPath() . DIRECTORY_SEPARATOR . $d->getFilename() . PHP_EOL);?></a></li></ul></div> <?php } } } } } } }
Я думаю, что вам нужна функция скандира . Ссылка показывает вам документацию по этой функции.