马黑黑 发表于 2025-4-24 21:42

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) &lt; 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 ("&lt;pre&gt;");
print_r($allFiles);
echo "&lt;/pre&gt;";
</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>

马黑黑 发表于 2025-4-24 21:47

这个实现思路将用于 hblog 某些模块,比如文件上传列表(之前已经使用 scandir 函数实现,效果和 glob 一样但代码没有这个简洁)、校验博文库文件(尚未加入)等等。

红影 发表于 2025-4-24 22:07

这个很方便,一下子就得到想要的子目录及其文件了{:4_187:}

马黑黑 发表于 2025-4-24 23:10

红影 发表于 2025-4-24 22:07
这个很方便,一下子就得到想要的子目录及其文件了

这是PHP非常基本的功能,只要充分利用内置的函数、方法、常量,可以轻松封装很多需要的自定义函数

红影 发表于 2025-4-24 23:45

马黑黑 发表于 2025-4-24 23:10
这是PHP非常基本的功能,只要充分利用内置的函数、方法、常量,可以轻松封装很多需要的自定义函数

这些内置的东西从来不知道,还是在黑黑的帖子里了解了一点呢{:4_187:}

马黑黑 发表于 2025-4-25 20:13

红影 发表于 2025-4-24 23:45
这些内置的东西从来不知道,还是在黑黑的帖子里了解了一点呢

PHP懂的人很少的。前几天认识一个人,她跟我抱怨PHP害得她瞎折腾了两个星期:她接到一个任务,将公司过去用PHP做的程序移植到新平台。她此前没有实质性接触过PHP,花一天时间阅读了手册之后就动手,然后没有一个细节做的顺。我跟她说,PHP最大的特点是变量可以声明可以不声明一般都不声明,这是你移植程序不顺的原因,你得再花一点点时间深入了解PHP,不急着动手,只有真正懂了PHP,移植工作才不盲目。

其实不止是PHP,任何一种语言,如果充分了解它,是无法读懂它的代码,在其上做工作根本就是瞎折腾。

红影 发表于 2025-4-25 21:33

马黑黑 发表于 2025-4-25 20:13
PHP懂的人很少的。前几天认识一个人,她跟我抱怨PHP害得她瞎折腾了两个星期:她接到一个任务,将公司过去 ...

是的,如果不是彻底了解,会做得漏洞百出呢。

马黑黑 发表于 2025-4-26 08:48

红影 发表于 2025-4-25 21:33
是的,如果不是彻底了解,会做得漏洞百出呢。

其实是根本做不来。很多人都想当然,认为编程语言都是相通的,跨语言是分分钟的事情。的确,所有的语言它们原理都一样,规则相近,作为粗浅了解,过目一下文档即可,但要真正使用它们,得弄清它们方方面面的细节,还有语言迭代的差异,不然会走很多弯路。

使用编程语言,可以不用全部记住内置函数、常量等等这些,估计也没有多少人能全部记住,关键是懂的它的原理、规范、规则,使用时具体用到某个函数、常量什么的,查一下手册。这和法官、律师与法律条文的关系差不多——不必记住所有的法律法规条文,但当需要援引某个条文时能迅速找到。

红影 发表于 2025-4-26 14:10

马黑黑 发表于 2025-4-26 08:48
其实是根本做不来。很多人都想当然,认为编程语言都是相通的,跨语言是分分钟的事情。的确,所有的语言它 ...

估计是查手册时也是泛泛过目的,没彻底了解它的含义,使用时就会出错了。

马黑黑 发表于 2025-4-26 23:19

红影 发表于 2025-4-26 14:10
估计是查手册时也是泛泛过目的,没彻底了解它的含义,使用时就会出错了。

过目一下有个大概了解。然后读源码,不懂的就去查文档。读懂源代码,改写源代码的可能性才成立。

红影 发表于 2025-4-26 23:37

马黑黑 发表于 2025-4-26 23:19
过目一下有个大概了解。然后读源码,不懂的就去查文档。读懂源代码,改写源代码的可能性才成立。

这里面还是有挺高要求的。

马黑黑 发表于 2025-4-27 12:05

红影 发表于 2025-4-26 23:37
这里面还是有挺高要求的。

不是一般的要求

红影 发表于 2025-4-27 13:38

马黑黑 发表于 2025-4-27 12:05
不是一般的要求

想使用它必须要吃透才行。

马黑黑 发表于 2025-4-27 21:45

红影 发表于 2025-4-27 13:38
想使用它必须要吃透才行。

对,理解很重要

红影 发表于 2025-4-27 22:13

马黑黑 发表于 2025-4-27 21:45
对,理解很重要

这个太难了。

马黑黑 发表于 2025-4-27 23:27

红影 发表于 2025-4-27 22:13
这个太难了。

有一定难度,尤其是定力不太好的人

红影 发表于 2025-4-28 14:28

马黑黑 发表于 2025-4-27 23:27
有一定难度,尤其是定力不太好的人

不是一定难度,而是非常大的难度呢{:4_173:}

马黑黑 发表于 2025-4-28 21:10

红影 发表于 2025-4-28 14:28
不是一定难度,而是非常大的难度呢

知识没有积累好

红影 发表于 2025-4-28 23:02

马黑黑 发表于 2025-4-28 21:10
知识没有积累好

嗯,知识需要累积,最好也是成系统地学习,才能学得透。

马黑黑 发表于 2025-4-28 23:30

红影 发表于 2025-4-28 23:02
嗯,知识需要累积,最好也是成系统地学习,才能学得透。

喜欢弄程序的人其实都知道一个道理:精通一门语言之后,其它任何语言都可以通过手册从事开发工作。所以,高端的程序员,一般在做一个项目的之前,先不去考虑使用什么语言,而是做草图,纲要,等等,然后再看看这么做,什么语言最优。
页: [1] 2
查看完整版本: PHP获取指定目录下第一层子目录及其所有文件