我有一段代码要修改,以列出当前路径中的文件夹和子文件夹中的所有文件。我找到了几种可能的解决方案。我试图实际实现它们,但似乎没有任何工作,所以我不确定它们是否真正起作用或者只是我实施它们是错误的。无论哪种方式,这都是我目前的代码:
<?php
$currentdir = 'C:/xampp/htdocs/test/'; //change to your directory
$dir = opendir($currentdir);
echo '<select name="workout">';
$file = preg_grep('/^([^.])/', scandir($dir));
while($file = readdir($dir))
{
if ($file != "." && $file != "..") {
echo "<option value='$file'>$file</option>";
}
else {
continue;
}
}
echo '</select>';
closedir($dir);
?>
目前此代码显示结果:
$currentdir
Option1
Option2
Option3
SUB-FOLDER1
SUB-FOLDER2
有人可以帮助我并告诉我如何使用现有代码编写/重写代码来显示文件夹和其他子文件夹中的文件,如下所示:
$currentdir
Option1
Option2
Option3
SUB-FOLDER1
Option1
Option2
Option3
SUB-FOLDER2
Option1
Option2
Option3
我非常渴望得到一个解决方案,并提前感谢你们。
答案 0 :(得分:3)
虽然其他答案都很好并且正确,但请允许我添加我的解决方案:
function dirToOptions($path = __DIR__, $level = 0) {
$items = scandir($path);
foreach($items as $item) {
// ignore items strating with a dot (= hidden or nav)
if (strpos($item, '.') === 0) {
continue;
}
$fullPath = $path . DIRECTORY_SEPARATOR . $item;
// add some whitespace to better mimic the file structure
$item = str_repeat(' ', $level * 3) . $item;
// file
if (is_file($fullPath)) {
echo "<option>$item</option>";
}
// dir
else if (is_dir($fullPath)) {
// immediatly close the optgroup to prevent (invalid) nested optgroups
echo "<optgroup label='$item'></optgroup>";
// recursive call to self to add the subitems
dirToOptions($fullPath, $level + 1);
}
}
}
echo '<select>';
dirToOptions();
echo '</select>';
它使用recursive调用来获取子项。请注意,我在每个项目之前添加了一些空格,以更好地模仿文件结构。此外,我立即关闭optgroup
,以防止以嵌套的optgroup
元素结束,这是无效的HTML。
答案 1 :(得分:0)
使用DirectoryIterator
查看文件夹是我的方法
$di = new DirectoryIterator("/dir");
foreach($di as $dir){
if ($dir->isDot()) continue;
echo "<option value='", $dir->getFilename(), "'>", $dir->getFilename(), "</option>";
}
无论如何也要查看子目录
$ri = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);
foreach($ri as $dir){
if ($dir->isDot()) continue;
echo "<option value='", $dir->getFilename(), "'>", $dir->getFilename(), "</option>";
}
答案 2 :(得分:0)
如果您不想使用上述声明,则另一种选择:
<?php
function listdir($currentdir){
$dir = opendir($currentdir);
$file = readdir($dir);
echo "<optgroup label='$currentdir'>";
do {
if (is_dir($currentdir."/".$file) && $file != "." && $file != ".."){
listdir($currentdir."/".$file);
echo $currentdir."/".$file;
} else if($file != "." && $file != "..") {
echo "<option value='$file'>$file</option>";
} else {
continue;
}
} while($file = readdir($dir));
echo "</optgroup>";
closedir($dir);
}
echo '<select name="workout">';
listdir('/var/www'); //change to your directory
echo '</select>';
?>
答案 3 :(得分:0)
查找指定目录下的所有文件和文件夹。
function scanDirAndSubdir($dir, &$out = []) {
$sun = scandir($dir);
foreach ($sun as $a => $filename) {
$way = realpath($dir . DIRECTORY_SEPARATOR . $filename);
if (!is_dir($way)) {
$out[] = $way;
} else if ($filename != "." && $filename != "..") {
scanDirAndSubdir($way, $out);
$out[] = $way;
}
}
return $out;
}
var_dump(scanDirAndSubdir('C:/xampp/htdocs/test/'));
array (size=4)
0 => string 'C:/xampp/htdocs/test/text1.txt' (length=30)
1 => string 'C:/xampp/htdocs/test/text1.txt' (length=30)
2 => string 'C:/xampp/htdocs/test/subfolder1/text8.txt' (length=41)
3 => string 'C:/xampp/htdocs/test/subfolder4/text9.txt' (length=41)