PHP获取指定目录下第一层子目录及其所有文件
本帖最后由 马黑黑 于 2025-4-24 21:50 编辑 <br /><br /><p>PHP获取子目录及其文件的方法很多,本文使用PHP内置函数 glob 简单实现,用函数返回关联数组的形式达成目标。</p><div id="hEdiv"><pre id="hEpre">
function listDirs($dir) {
if (!is_dir($dir)) return []; // 目录若不存在返回空数组
$file_ar = array(); // 装载目录及其下文件(关联数组)
$ds = glob($dir . "*", GLOB_ONLYDIR); // 使用 glob 先获取子目录
if (count($ds) < 1) return []; // 若没有子目录返回空数组
// 遍历子目录
foreach ($ds as $d) {
// 使用 glob 获得 $d 子目录下所有资源(目录和文件)
$files = glob($d . "/{,.}*", GLOB_BRACE);
// 遍历每一个资源
foreach ($files as $file) {
// 如果是文件则加入到该目录关联数组
if (is_file($file )) {
$file_ar[$d][] = $file;
}
}
}
return $file_ar; //返回数组
}
// 应用示例:注意目录名末尾符号 /
$allFiles = listDirs("./");
echo ("<pre>");
print_r($allFiles);
echo "</pre>";
</pre></div>
<p>打印结果类似下面这样:</p>
<pre>
Array
(
[./2025] => Array
(
=> ./2025/Highgh歌 (Live).mp3
=> ./2025/TruE.mp3
=> ./2025/《篇外》.mp3
=> ./2025/来日方长.mp3
=> ./2025/苍生 (Timeless Romance).mp3
=> ./2025/风月.mp3
)
[./uploads] => Array
(
=> ./uploads/index.php
=> ./uploads/index_bak.php
=> ./uploads/upload.html
=> ./uploads/upload.php
)
)
</pre>
<p>这就是PHP关联数组的数据结构,也可以根据需要修改 listDirs 函数以便拿到自己所需要的数据。</p>
<script type="module">
import hlight from 'https://638183.freep.cn/638183/web/helight/helight1.js';
hlight.hl(hEdiv, hEpre);
</script>
这个实现思路将用于 hblog 某些模块,比如文件上传列表(之前已经使用 scandir 函数实现,效果和 glob 一样但代码没有这个简洁)、校验博文库文件(尚未加入)等等。 这个很方便,一下子就得到想要的子目录及其文件了{:4_187:} 红影 发表于 2025-4-24 22:07
这个很方便,一下子就得到想要的子目录及其文件了
这是PHP非常基本的功能,只要充分利用内置的函数、方法、常量,可以轻松封装很多需要的自定义函数 马黑黑 发表于 2025-4-24 23:10
这是PHP非常基本的功能,只要充分利用内置的函数、方法、常量,可以轻松封装很多需要的自定义函数
这些内置的东西从来不知道,还是在黑黑的帖子里了解了一点呢{:4_187:} 红影 发表于 2025-4-24 23:45
这些内置的东西从来不知道,还是在黑黑的帖子里了解了一点呢
PHP懂的人很少的。前几天认识一个人,她跟我抱怨PHP害得她瞎折腾了两个星期:她接到一个任务,将公司过去用PHP做的程序移植到新平台。她此前没有实质性接触过PHP,花一天时间阅读了手册之后就动手,然后没有一个细节做的顺。我跟她说,PHP最大的特点是变量可以声明可以不声明一般都不声明,这是你移植程序不顺的原因,你得再花一点点时间深入了解PHP,不急着动手,只有真正懂了PHP,移植工作才不盲目。
其实不止是PHP,任何一种语言,如果充分了解它,是无法读懂它的代码,在其上做工作根本就是瞎折腾。 马黑黑 发表于 2025-4-25 20:13
PHP懂的人很少的。前几天认识一个人,她跟我抱怨PHP害得她瞎折腾了两个星期:她接到一个任务,将公司过去 ...
是的,如果不是彻底了解,会做得漏洞百出呢。 红影 发表于 2025-4-25 21:33
是的,如果不是彻底了解,会做得漏洞百出呢。
其实是根本做不来。很多人都想当然,认为编程语言都是相通的,跨语言是分分钟的事情。的确,所有的语言它们原理都一样,规则相近,作为粗浅了解,过目一下文档即可,但要真正使用它们,得弄清它们方方面面的细节,还有语言迭代的差异,不然会走很多弯路。
使用编程语言,可以不用全部记住内置函数、常量等等这些,估计也没有多少人能全部记住,关键是懂的它的原理、规范、规则,使用时具体用到某个函数、常量什么的,查一下手册。这和法官、律师与法律条文的关系差不多——不必记住所有的法律法规条文,但当需要援引某个条文时能迅速找到。 马黑黑 发表于 2025-4-26 08:48
其实是根本做不来。很多人都想当然,认为编程语言都是相通的,跨语言是分分钟的事情。的确,所有的语言它 ...
估计是查手册时也是泛泛过目的,没彻底了解它的含义,使用时就会出错了。 红影 发表于 2025-4-26 14:10
估计是查手册时也是泛泛过目的,没彻底了解它的含义,使用时就会出错了。
过目一下有个大概了解。然后读源码,不懂的就去查文档。读懂源代码,改写源代码的可能性才成立。 马黑黑 发表于 2025-4-26 23:19
过目一下有个大概了解。然后读源码,不懂的就去查文档。读懂源代码,改写源代码的可能性才成立。
这里面还是有挺高要求的。 红影 发表于 2025-4-26 23:37
这里面还是有挺高要求的。
不是一般的要求 马黑黑 发表于 2025-4-27 12:05
不是一般的要求
想使用它必须要吃透才行。 红影 发表于 2025-4-27 13:38
想使用它必须要吃透才行。
对,理解很重要 马黑黑 发表于 2025-4-27 21:45
对,理解很重要
这个太难了。 红影 发表于 2025-4-27 22:13
这个太难了。
有一定难度,尤其是定力不太好的人 马黑黑 发表于 2025-4-27 23:27
有一定难度,尤其是定力不太好的人
不是一定难度,而是非常大的难度呢{:4_173:} 红影 发表于 2025-4-28 14:28
不是一定难度,而是非常大的难度呢
知识没有积累好 马黑黑 发表于 2025-4-28 21:10
知识没有积累好
嗯,知识需要累积,最好也是成系统地学习,才能学得透。 红影 发表于 2025-4-28 23:02
嗯,知识需要累积,最好也是成系统地学习,才能学得透。
喜欢弄程序的人其实都知道一个道理:精通一门语言之后,其它任何语言都可以通过手册从事开发工作。所以,高端的程序员,一般在做一个项目的之前,先不去考虑使用什么语言,而是做草图,纲要,等等,然后再看看这么做,什么语言最优。
页:
[1]
2