Следующий код отобразит весь файл в каталоге
<?php if ($handle = opendir('.')) { while (false !== ($file = readdir($handle))) { if (($file != ".") && ($file != "..")) { $thelist .= '<LI><a href="'.$file.'">'.$file.'</a>'; } } closedir($handle); } ?> <P>List of files:</p> <UL> <P><?=$thelist?></p> </UL>
Хотя это очень простой код, он выполняет эту работу.
Я теперь ищу способ опубликовать ТОЛЬКО файлы, в которых есть .xml (или .XML) в конце, как это сделать?
if ($handle = opendir('.')) { while (false !== ($file = readdir($handle))) { if ($file != "." && $file != ".." && strtolower(substr($file, strrpos($file, '.') + 1)) == 'xml') { $thelist .= '<li><a href="'.$file.'">'.$file.'</a></li>'; } } closedir($handle); }
Простой способ просмотра расширения с использованием substr и strrpos
Вы захотите использовать glob()
Пример:
$files = glob('/path/to/dir/*.xml');
$it = new RegexIterator(new DirectoryIterator("."), "/\\.xml\$/i")); foreach ($it as $filename) { //... }
Вы также можете использовать рекурсивные варианты итераторов для перемещения по всей иерархии каталогов.
ФАЙЛЫ СПИСКОВ И ПАПКИ в каталоге (полный код):
ps вы должны раскомментировать 5-ю строку, если хотите только для определенных расширений
<?PHP # The current directory $directory = dir("./"); # If you want to turn on Extension Filter, then uncomment this: ### $allowed_ext = array(".sample", ".png", ".jpg", ".jpeg", ".txt", ".doc", ".xls"); ## Description of the soft: list_dir_files.php ## Major credits: phpDIRList 2.0 -(c)2005 Ulrich S. Kapp :: Systemberatung :: $do_link = TRUE; $sort_what = 0; //0- by name; 1 - by size; 2 - by date $sort_how = 0; //0 - ASCENDING; 1 - DESCENDING # # # function dir_list($dir){ $i=0; $dl = array(); if ($hd = opendir($dir)) { while ($sz = readdir($hd)) { if (preg_match("/^\./",$sz)==0) $dl[] = $sz;$i.=1; } closedir($hd); } asort($dl); return $dl; } if ($sort_how == 0) { function compare0($x, $y) { if ( $x[0] == $y[0] ) return 0; else if ( $x[0] < $y[0] ) return -1; else return 1; } function compare1($x, $y) { if ( $x[1] == $y[1] ) return 0; else if ( $x[1] < $y[1] ) return -1; else return 1; } function compare2($x, $y) { if ( $x[2] == $y[2] ) return 0; else if ( $x[2] < $y[2] ) return -1; else return 1; } }else{ function compare0($x, $y) { if ( $x[0] == $y[0] ) return 0; else if ( $x[0] < $y[0] ) return 1; else return -1; } function compare1($x, $y) { if ( $x[1] == $y[1] ) return 0; else if ( $x[1] < $y[1] ) return 1; else return -1; } function compare2($x, $y) { if ( $x[2] == $y[2] ) return 0; else if ( $x[2] < $y[2] ) return 1; else return -1; } } ################################################## # We get the information here ################################################## $i = 0; while($file=$directory->read()) { $file = strtolower($file); $ext = strrchr($file, '.'); if (isset($allowed_ext) && (!in_array($ext,$allowed_ext))) { // dump } else { $temp_info = stat($file); $new_array[$i][0] = $file; $new_array[$i][1] = $temp_info[7]; $new_array[$i][2] = $temp_info[9]; $new_array[$i][3] = date("F d, Y", $new_array[$i][2]); $i = $i + 1; } } $directory->close(); ################################################## # We sort the information here ################################################# switch ($sort_what) { case 0: usort($new_array, "compare0"); break; case 1: usort($new_array, "compare1"); break; case 2: usort($new_array, "compare2"); break; } ############################################################### # We display the infomation here ############################################################### $i2 = count($new_array); $i = 0; echo "<table border=1> <tr> <td width=150> File name</td> <td width=100> File Size</td> <td width=100>Last Modified</td> </tr>"; for ($i=0;$i<$i2;$i++) { if (!$do_link) { $line = "<tr><td align=right>" . $new_array[$i][0] . "</td><td align=right>" . number_format(($new_array[$i][1]/1024)) . "k"; $line = $line . "</td><td align=right>" . $new_array[$i][3] . "</td></tr>"; }else{ $line = '<tr><td align=right><A HREF="' . $new_array[$i][0] . '">' . $new_array[$i][0] . "</A></td><td align=right>"; $line = $line . number_format(($new_array[$i][1]/1024)) . "k" . "</td><td align=right>" . $new_array[$i][3] . "</td></tr>"; } echo $line; } echo "</table>"; ?>
Вы должны использовать glob.
glob('*.xml')
Подробнее об использовании glob и расширенной фильтрации:
http://domexception.blogspot.fi/2013/08/php-using-functional-programming-for.html
Я использую этот код:
<?php { //foreach (glob("images/*.jpg") as $large) foreach (glob("*.xml") as $filename) { //echo "$filename\n"; //echo str_replace("","","$filename\n"); echo str_replace("","","<a href='$filename'>$filename</a>\n"); } } ?>
'.xml' == strtolower(substr($file, -3))
ответ – поставить другое условие '.xml' == strtolower(substr($file, -3))
.
Но я бы тоже рекомендовал использовать glob
.
Вы можете расширить класс RecursiveFilterIterator следующим образом:
class ExtensionFilter extends RecursiveFilterIterator { /** * Hold the extensions pass to the class constructor */ protected $extensions; /** * ExtensionFilter constructor. * * @param RecursiveIterator $iterator * @param string|array $extensions Extension to filter as an array ['php'] or * as string with commas in between 'php, exe, ini' */ public function __construct(RecursiveIterator $iterator, $extensions) { parent::__construct($iterator); $this->extensions = is_array($extensions) ? $extensions : array_map('trim', explode(',', $extensions)); } public function accept() { if ($this->hasChildren()) { return true; } return $this->current()->isFile() && in_array(strtolower($this->current()->getExtension()), $this->extensions); } public function getChildren() { return new self($this->getInnerIterator()->getChildren(), $this->extensions); }
Теперь вы можете создать экземпляр RecursiveDirectoryIterator с помощью пути в качестве аргумента следующим образом:
$iterator = new RecursiveDirectoryIterator('\path\to\dir'); $iterator = new ExtensionFilter($iterator, 'xml, php, ini'); foreach($iterator as $file) { echo $file . '<br />'; }
Это приведет к отображению файлов только в текущей папке.
Чтобы получить файлы в поддиректориях, передайте $ iterator (ExtensionFIlter Iterator) в RecursiveIteratorIterator в качестве аргумента:
$iterator = new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::SELF_FIRST);
Теперь запустите цикл foreach на этом итераторе. Вы получите файлы с указанным расширением
Примечание. Также убедитесь, что вы запускаете ExtensionFilter до RecursiveIteratorIterator, иначе вы получите все файлы