使用PHP的Glob()函数来遍历文件夹
你还在使用 opendir() 来遍历文件夹吗?那样岂不是会生成很多冗余的代码?幸运的是,PHP的 glob() 是一个更加智能的解决方案。
下面这个范例的作用就是输出文件夹的一些信息,使用的是传统的 opendir() 函数:
$dir = "/etc/php5/"; // Open a known directory, and proceed to read its contents if (is_dir($dir)) { if ($dh = opendir($dir)) { while (($file = readdir($dh)) !== false) { echo "filename: $file : filetype: " . filetype($dir . $file) . "\n"; } closedir($dh); } }
那看起来应该有点熟悉。我们可以大幅度地精简以上的代码:
$dir = "/etc/php5/*"; // Open a known directory, and proceed to read its contents foreach(glob($dir) as $file) { echo "filename: $file : filetype: " . filetype($file) . "<br />"; }
是不是简单多了?很想了解这方法是怎么运行的吗?下面我们就来讲解一下。
glob() 一共支持两个参数,第二个参数是可选的。第一个参数就是文件夹的路径,然而比它更为强大。
第一个参数支持表达式。这就意味着你可以使用多个星号(*)来限制搜索特定的文件类型或者同时搜索多个文件夹。假设你有一个网站允许用户上传图片。每个用户在 “userimages” 目录下都有他/她自己单独的目录。在这些目录里面还有两个额外的目录,名叫 “HD” 和 “TN”,分别代表高清(完整大小)的图片和缩略图。想像一下你要遍历所有用户的 “TN” 目录并且打印出文件名。如果你使用 open_dir() 函数的话,代码量会很大;然而如果使用 glob(),那就简单多了。
foreach(glob('userImages/*/TN/*') as $image) { echo "Filename: " . $image . "<br />"; }
这将会搜索 userImages/any/TN/any 并将返回符合表达式的所有文件的列表。
Filename: userImages/username1/TN/test.jpg Filename: userImages/username1/TN/test3.jpg Filename: userImages/username1/TN/test5.png Filename: userImages/username2/TN/subfolder Filename: userImages/username2/TN/test2.jpg Filename: userImages/username2/TN/test4.gif Filename: userImages/username3/TN/styles.css
我们还可以进一步在 foreach 语句中限制文件类型:
foreach(glob('userImages/*/TN/*.jpg') as $image) { echo "Filename: " . $image . "<br />"; }
现在,程序将只返回 Jpeg 图片。
Filename: userImages/username1/TN/test.jpg Filename: userImages/username1/TN/test3.jpg Filename: userImages/username2/TN/test2.jpg
这就更好了。如果你只需要 Jpeg 和 Gif 文件,不需要其它的,那该怎么办?又或者你只需要打印出目录名称?这就是第二个参数发挥作用的时候了。
正如前面所说到的那样,第二个参数是可选的。
但它确实提供了一系列很棒的选项标志。这些选项允许你更改 glob() 的运作方式。
GLOB_MARK: 给返回的每个目录添加斜杠
GLOB_NOSORT: 按照目录中的形式返回文件(不排序)
GLOB_NOCHECK: 如果没有符合条件的结果,则返回搜索表达式
GLOB_NOESCAPE: 反斜杠不引用元字符
GLOB_BRACE: 扩展 {a,b,c} 以匹配 ‘a’, ‘b’, 或 ‘c’
GLOB_ONLYDIR: 只返回符合表达式的目录
GLOB_ERR: 遇到读取错误(例如不可读的目录)时停止执行,默认情况下是忽略错误的
正如你所看到的那样,步骤1末尾的那个需求可以通过 GLOB_BRACE 来满足:
foreach(glob('userImages/*/TN/{*.jpg,*.gif}', GLOB_BRACE) as $image) { echo "Filename: " . $image . "<br />"; }
程序将返回以下内容:
Filename: userImages/username1/TN/test.jpg Filename: userImages/username1/TN/test3.jpg Filename: userImages/username2/TN/test2.jpg Filename: userImages/username2/TN/test4.gif
如果我们只想要输出子目录名称,我们可以使用 GLOB_ONLYDIR:
foreach(glob('userImages/*/TN/*', GLOB_ONLYDIR) as $image) { echo "Filename: " . $image . "<br />"; }
程序将输出:
Filename: userImages/username2/TN/subfolder
结论和额外的范例
这个函数在PHP 4.3之后的版本中出现,但很奇怪的是,人们很少使用它。我也是最近才学会怎么使用它的。现在,我经常使用 glob() 来加载我的框架中的插件:
foreach(glob('includes/plugins/*.php') as $plugin) { include_once($plugin); }
就是这样,希望您能喜欢这个教程,谢谢。
3 条评论
很好, 谢谢你的博客.
这函数先进,感谢