RSS
  • 首页
  • 关于

与标签 ‘glob’ 相关的文章

使用PHP的Glob()函数来遍历文件夹

七月 22, 2010 by admin | 1 Comment »
原创译文,转载请注明出处。原作者为Marcus Schumann,原文请 单击这里 查看。

你还在使用 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() 一共支持两个参数,第二个参数是可选的。第一个参数就是文件夹的路径,然而比它更为强大。

步骤1. 第一个参数

第一个参数支持表达式。这就意味着你可以使用多个星号(*)来限制搜索特定的文件类型或者同时搜索多个文件夹。假设你有一个网站允许用户上传图片。每个用户在 “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 文件,不需要其它的,那该怎么办?又或者你只需要打印出目录名称?这就是第二个参数发挥作用的时候了。

步骤2.第二个参数

正如前面所说到的那样,第二个参数是可选的。
但它确实提供了一系列很棒的选项标志。这些选项允许你更改 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);
	}

就是这样,希望您能喜欢这个教程,谢谢。


PHP, 译文 | Tags: glob, opendir, PHP, 遍历


IT狂人的博客

  • 声明

    本博文章及相关作品(包括但不限于文字、图片),除特别说明为转载外,均属本人原创,依据《国家知识产权法》、《著作权法》和《信息网络传播权保护条例》,原创知识产权、版权均为本人所有,本人享有著作权,并受法律保护。

    文章欢迎转载,但请事先与本人联系:email
    未经本人许可,任何人不得转载或使用整体或任何部分的内容。未尽事宜,依据相关法律法规处理。

  • 分类目录

    • ASP .Net (1)
    • CodeIgniter (8)
    • PHP (10)
    • Web (7)
    • 未分类 (1)
    • 杂谈 (4)
    • 译文 (7)
    • 音乐&电影 (1)
  • 最近文章

    • Discuz上传图片时出现“无效的图片文件”提示的解决方案
    • discuz定时发帖的另类实现
    • 使用PHP的Glob()函数来遍历文件夹
    • [译]PHP面向对象入门
    • 原来如此
    • 使用htaccess来增强WordPress安全性
    • 归来
    • 因4740G而想起的事
    • 选择Web开发框架时需要考虑的15个重要因素
    • 为NetBeans添加Git支持
  • 文章归档

    • 2010 年 八月 (2)
    • 2010 年 七月 (5)
    • 2010 年 五月 (1)
    • 2010 年 四月 (1)
    • 2010 年 三月 (2)
    • 2010 年 二月 (1)
    • 2010 年 一月 (2)
    • 2009 年 十二月 (1)
    • 2009 年 十月 (2)
    • 2009 年 九月 (3)
    • 2009 年 八月 (10)
  • 标签

    API AVC CakePHP CHM CodeIgniter CURD discuz Django DroidSansFallback eaccelerator footer Framework Fran Healy Git helper IT Kohana MVC MVP MYSQL NetBeans Oasis ORM pChart pdf PHP phpMyAdmin Ruby tcpdf techified time Travis Twitter Web windows Wordpress XML Zend 传记 外链 大写 孔乙己 框架 盗链 过滤
  •  

    2010 九月
    一 二 三 四 五 六 日
    « 八    
     12345
    6789101112
    13141516171819
    20212223242526
    27282930  
  • Playlist


  • 近期评论

    • admin 在 [译文]在NetBeans IDE中增加CodeIgniter代码提示 上的评论
    • admin 在 使用TCPDF输出完美的中文PDF文档 上的评论
    • admin 在 使用TCPDF输出完美的中文PDF文档 上的评论
    • Macca 在 使用TCPDF输出完美的中文PDF文档 上的评论
    • Macca 在 使用TCPDF输出完美的中文PDF文档 上的评论
  • 链接

    • cnBeta.COM
    • CodeIgniter 中国
    • Gray && Simple
    • jQuery中文社区
    • Lily Allen
    • Mtime时光网
    • W3School
    • 小众软件
    • 破烂熊乐园
    • 韩寒
Copyright © 2010 IT狂人的博客 All Rights Reserved. XHTML CSS THEME by I SOFTWARE REVIEWS