php glob实现目录文件遍历与寻找与模式匹配的文件路径

 更新时间:2016年11月25日 16:48  点击:1771
采用PHP函数glob实现寻找与模式匹配的文件路径,主要讨论glob()函数的作用和用法,利用glob函数读取目录比其它的要快N倍,因为glob函数是内置函数处理起来自然要快。

一,函数原型
array glob ( string pattern [, int flags] )
注意:glob()函数获取的是一个数组,其返回一个包含有匹配文件/目录的数组。如果出错返回FALSE

二,版本兼容
PHP 4 >= 4.3.0, PHP 5

三,函数的基础用法与实例

1,匹配目录下.txt后缀的文件


 

 代码如下 复制代码
<?php
foreach (glob("*.txt") as $filename) {
    echo $filename;
}
?>


2,实现兼容大小写匹配


 

 代码如下 复制代码
<?php
$pattern = sql_case("*.pdf");
var_dump(glob($pattern));
?>


类似如下


 

 代码如下 复制代码
<?php
foreach (array_merge(glob("*.pdf"),glob("*.PDF")) as $filename) {
     echo "$filename n";
}
?>


3,获取目录下的所有子目录


 

 代码如下 复制代码
<?php
function listdirs($dir) {
   static $alldirs = array();
   $dirs = glob($dir . '/*', GLOB_ONLYDIR);
   if (count($dirs) > 0) {
       foreach ($dirs as $d) $alldirs[] = $d;
   }
   foreach ($dirs as $dir) listdirs($dir);
   return $alldirs;
}
?>


4,匹配所有文件

 

 代码如下 复制代码
<?php
$files = glob('{,.}*', GLOB_BRACE);
?>


四,注意事项
1,不能作用于远程文件,被检查的文件必须通过服务器的文件系统访问。
2,使用 glob("[myfolder]/*.txt")将不能匹配,解决方法为 glob("[myfolder]/*.txt"),注意[]字符应用。
3,其次是第二个参数flags有效标记说明
(1)GLOB_MARK - 在每个返回的项目中加一个斜线
(2)GLOB_NOSORT - 按照文件在目录中出现的原始顺序返回(不排序)
(3)GLOB_NOCHECK - 如果没有文件匹配则返回用于搜索的模式
(4)GLOB_NOESCAPE - 反斜线不转义元字符
(5)GLOB_BRACE - 扩充 {a,b,c} 来匹配 'a','b' 或 'c'
(6)GLOB_ONLYDIR - 仅返回与模式匹配的目录项 注意: 在 PHP 4.3.3 版本之前 GLOB_ONLYDIR 在 Windows 或者其它不使用 GNU C 库的系统上不可用。
(7)GLOB_ERR - 停止并读取错误信息(比如说不可读的目录),默认的情况下忽略所有错误 注意: GLOB_ERR 是 PHP 5.1 添加的。

glob()函数的典型应用是读取数据表文件,如获取某个目录下的.sql后缀文件,这种在单元测试中非常实用,可实现读取sql文件重建数据库等,具体请参与PHP手册,请关注下一期PHP内置函数研究系列

其它参考

 

 代码如下 复制代码

例子 1
<?php
print_r(glob("*.txt"));
?>输出类似:

Array
(
[0] => target.txt
[1] => source.txt
[2] => test.txt
[3] => test2.txt
)例子 2
<?php
print_r(glob("*.*"));
?>输出类似:

Array
(
[0] => contacts.csv
[1] => default.php
[2] => target.txt
[3] => source.txt
[4] => tem1.tmp
[5] => test.htm
[6] => test.ini
[7] => test.php
[8] => test.txt
[9] => test2.txt
)

PHP extract() 函数从数组中把变量导入到当前的符号表中。 对于数组中的每个元素,键名用于变量名,键值用于变量值。 第二个参数 type 用于指定当某个变量已经存在,而数组中又有同名元素时,extract() 函数如何对待这样的冲突。

将变量从PHP数组导出注册为全局变量,实现键名当作变量名,值作为变量的值,如下

 代码如下 复制代码
$vars = array('var1'=>'1','var2'=>'2','var3'=>'3','var4'=>'4','var5'=>'5');

实现通过键名当作变量名的形式访问,如:$var1,$var2

第一种方案:采用PHP内置extract()函数,方法如下

 代码如下 复制代码
extract($vars);

第二种方案:采用foreach循环数组注册为全局变量,方法如下

 代码如下 复制代码
foreach($vars as $k=>$v){
    $GLOBALS[$k] = $v;
}

推荐采用第二种方案,因为extract()函数存在性能和安全问题。

extract() 函数说明

(PHP 3 >= 3.0.7, PHP 4, PHP 5)
extract -- 从数组中将变量导入到当前的符号表

 代码如下 复制代码

int extract ( array var_array [, int extract_type [, string prefix]] )

本函数用来将变量从数组中导入到当前的符号表中。接受结合数组 var_array 作为参数并将键名当作变量名,值作为变量的值。对每个键/值对都会在当前的符号表中建立变量,并受到 extract_type 和 prefix 参数的影响。

参考表

参数 描述
array 必需。规定要使用的输入。
extract_rules

可选。extract() 函数将检查每个键名是否为合法的变量名,同时也检查和符号表中的变量名是否冲突。

对非法、数字和冲突的键名的处理将根据此参数决定。可以是以下值之一:

可能的值:

  • EXTR_OVERWRITE - 默认。如果有冲突,则覆盖已有的变量。
  • EXTR_SKIP - 如果有冲突,不覆盖已有的变量。(忽略数组中同名的元素)
  • EXTR_PREFIX_SAME - 如果有冲突,在变量名前加上前缀 prefix。自 PHP 4.0.5 起,这也包括了对数字索引的处理。
  • EXTR_PREFIX_ALL - 给所有变量名加上前缀 prefix(第三个参数)。
  • EXTR_PREFIX_INVALID - 仅在非法或数字变量名前加上前缀 prefix。本标记是 PHP 4.0.5 新加的。
  • EXTR_IF_EXISTS - 仅在当前符号表中已有同名变量时,覆盖它们的值。其它的都不处理。可以用在已经定义了一组合法的变量,然后要从一个数组例如 $_REQUEST 中提取值覆盖这些变量的场合。本标记是 PHP 4.2.0 新加的。
  • EXTR_PREFIX_IF_EXISTS - 仅在当前符号表中已有同名变量时,建立附加了前缀的变量名,其它的都不处理。本标记是 PHP 4.2.0 新加的。
  • EXTR_REFS - 将变量作为引用提取。这有力地表明了导入的变量仍然引用了 var_array 参数的值。可以单独使用这个标志或者在 extract_type 中用 OR 与其它任何标志结合使用。本标记是 PHP 4.3.0 新加的。
prefix

可选。请注意 prefix 仅在 extract_type 的值是 EXTR_PREFIX_SAME,EXTR_PREFIX_ALL,EXTR_PREFIX_INVALID 或 EXTR_PREFIX_IF_EXISTS 时需要。如果附加了前缀后的结果不是合法的变量名,将不会导入到符号表中。

前缀和数组键名之间会自动加上一个下划线。

使用全部参数:

 代码如下 复制代码

<?php
$a = 'Original';
$my_array = array("a" => "Cat","b" => "Dog", "c" => "Horse");

extract($my_array, EXTR_PREFIX_SAME, 'dup');

echo "$a = $a; $b = $b; $c = $c; $dup_a = $dup_a;";
?>

输出:

$a = Original; $b = Dog; $c = Horse; $dup_a = Cat;

 

 

PHP内置函数研究系列第四期,采用PHP函数parse_str实现查询字符串解析到变量中,主要讨论parse_str()函数的作用和用法。

parse_str()函数可实现把字符串解析到变量中,这意味着实现了字符串与变量之间的一种转换机制,在与客户端数据传递的过程中,数据是通过字符串的形式传递,如GET请求,然后在服务器端通过$_GET/$_POST等全局变量实现字符串与变量的转换,如:http://www.liuhui.info/?index.php?var1=1&var2=2,请求后服务端可使用$_GET['var1']的方式获取var1=1&var2=2这一段字符串转换成变量。parse_str()函数可实现用样的功能,使用parse_str()函数解析$_SERVER['QUERY_STRING']的值,就可以直接实现字符串与变量的转换,如$var1。

一,函数原型

 代码如下 复制代码
void parse_str ( string str [, array &arr] )

二,版本兼容
PHP 3, PHP 4, PHP 5

三,函数基础用法与实例
1,解析字符串为变量

 代码如下 复制代码

<?php
parse_str("var1=liuhui&var2=parse_str");
echo $var1.$var2;
?>


2,解析字符串并将变量存储到数组中

 代码如下 复制代码

<?php
parse_str("var1=liuhui&var2=parse_str",$array);
print_r($array);
?>


输出:Array ( [var1] => liuhui [var2] => parse_str )

说明:这种将变量存储到数组中在PHP 4.0.3 才增加

3,解析的字符串有空格

 代码如下 复制代码

<?php
parse_str("v ar1=liuhui&var 2=parse_str",$array);
print_r($array);
?>

输出:Array ( [v_ar1] => liuhui [var_2] => parse_str )

说明:直接将空格转换为下划线_

四,注意事项
1,如果未设置 array 参数,由该函数设置的变量将覆盖已由同名变量。
2,php.ini 中的 magic_quotes_gpc 设置影响该函数的输出。如果已启用,那么在 parse_str() 解析之前,变量会被 addslashes() 转换。
3,parse_str() 函数在处理参数时存在漏洞,攻击者可以利用这个漏洞启用register_globals,从而进一步利用其他PHP脚本中的漏洞。如果仅以一个参数调用 parse_str()的话,该函数会认为该参数是通过URL传送的请求字符串那样解析所提供的字符串,但外部攻击者可以在调用 parse_str()期间发送很多请求变量来触发memory_limit请求终止。如果在调用parse_str()期间执行了请求关闭的话,则在相 关webserver进程的其余生命周期期间register_globals标签会一直打开。

 

在php中strtotime() 函数将任何英文文本的日期时间描述解析为 Unix 时间戳,这个函数也是我们经常会用到的,有需要的朋友参考一下。

语法
strtotime(time,now)参数 描述
time 规定要解析的时间字符串。
now 用来计算返回值的时间戳。如果省略该参数,则使用当前时间。


例子

 代码如下 复制代码

<?php
echo(strtotime("now"));
echo(strtotime("3 October 2005"));
echo(strtotime("+5 hours"));
echo(strtotime("+1 week"));
echo(strtotime("+1 week 3 days 7 hours 5 seconds"));
echo(strtotime("next Monday"));
echo(strtotime("last Sunday"));
?>输出:

1138614504
1128290400
1138632504
1139219304
1139503709
1139180400
1138489200

Example #1 strtotime() 例子

 代码如下 复制代码
<?php
echo strtotime("now"), "n";
echo strtotime("10 September 2000"), "n";
echo strtotime("+1 day"), "n";
echo strtotime("+1 week"), "n";
echo strtotime("+1 week 2 days 4 hours 2 seconds"), "n";
echo strtotime("next Thursday"), "n";
echo strtotime("last Monday"), "n";
?>


Example #2 失败检查

 代码如下 复制代码

<?php
$str = 'Not Good';

// previous to PHP 5.1.0 you would compare with -1, instead of false
if (($timestamp = strtotime($str)) === false) {
    echo "The string ($str) is bogus";
} else {
    echo "$str == " . date('l dS of F Y h:i:s A', $timestamp);
}
?>

I just found out PHP thinks slashes in date-formats aren't very european:
(I guess this is not a bug, just the way it works. But correct me if I'm wrong.)
<?php

    $date = "06/10/2011 14:28"; // 6 october 2011 2:28 pm
    $otherDate = "06-10-2011 14:28"; // 6 october 2011 2:28 pm
   
    echo $stamp = strtotime($date) . "<br />"; // outputs 1307708880
    echo $otherStamp = strtotime($otherDate) . "<br />"; // outputs 1317904080
   
    echo date("d-m", $stamp); // outputs 10-06
    echo date("d-m", $otherStamp); // outputs 06-10

?>

分享一篇关于linux中fgetcsv取得的数组元素为空字符串的解决方法的教程,有需要的朋友可以参考一下下哈。

使用CSV导入数据的时候,我们通常用的是Windows系统,使用GBK在Windows的Excel中编辑.

但服务器上,很多使用Linux服务器,源程序使用UTF-8,这样很容易产生字符编码的问题.

如果仅仅将CSV文件转码为UTF-8,这样在Windows服务器上没有问题,

而在RedHat5.5上,用fgetcsv取得的数组中,如果某列的内容是中文,则该列对应的数组元素为空字符串,而英文则正常.

这时,需要设置区域: 

 代码如下 复制代码

setlocale(LC_ALL, 'zh_CN.UTF-8');
代码如下


// 上传的CSV文件,通常是用Excel编辑的GBK编码,
// 而源代码是UTF-8,需要进行转码处理
file_put_contents($new_file, iconv('GBK', 'UTF-8', file_get_contents($new_file)));

//ini_set('auto_detect_line_endings', true);
// 设置区域:简体中文,UTF-8编码
setlocale(LC_ALL, 'zh_CN.UTF-8');
// 打开CSV文件
$handle = fopen($new_file, 'r');
// 取出列头
$data_heads = fgetcsv($handle);

[!--infotagslink--]

相关文章

  • php读取zip文件(删除文件,提取文件,增加文件)实例

    下面小编来给大家演示几个php操作zip文件的实例,我们可以读取zip包中指定文件与删除zip包中指定文件,下面来给大这介绍一下。 从zip压缩文件中提取文件 代...2016-11-25
  • Jupyter Notebook读取csv文件出现的问题及解决

    这篇文章主要介绍了JupyterNotebook读取csv文件出现的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2023-01-06
  • 解决Pycharm的项目目录突然消失的问题

    今天小编就为大家分享一篇解决Pycharm的项目目录突然消失的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-22
  • Photoshop打开PSD文件空白怎么解决

    有时我们接受或下载到的PSD文件打开是空白的,那么我们要如何来解决这个 问题了,下面一聚教程小伙伴就为各位介绍Photoshop打开PSD文件空白解决办法。 1、如我们打开...2016-09-14
  • C#操作本地文件及保存文件到数据库的基本方法总结

    C#使用System.IO中的文件操作方法在Windows系统中处理本地文件相当顺手,这里我们还总结了在Oracle中保存文件的方法,嗯,接下来就来看看整理的C#操作本地文件及保存文件到数据库的基本方法总结...2020-06-25
  • 解决python 使用openpyxl读写大文件的坑

    这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
  • C#实现HTTP下载文件的方法

    这篇文章主要介绍了C#实现HTTP下载文件的方法,包括了HTTP通信的创建、本地文件的写入等,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • SpringBoot实现excel文件生成和下载

    这篇文章主要为大家详细介绍了SpringBoot实现excel文件生成和下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-09
  • php无刷新利用iframe实现页面无刷新上传文件(1/2)

    利用form表单的target属性和iframe 一、上传文件的一个php教程方法。 该方法接受一个$file参数,该参数为从客户端获取的$_files变量,返回重新命名后的文件名,如果上传失...2016-11-25
  • php批量替换内容或指定目录下所有文件内容

    要替换字符串中的内容我们只要利用php相关函数,如strstr,str_replace,正则表达式了,那么我们要替换目录所有文件的内容就需要先遍历目录再打开文件再利用上面讲的函数替...2016-11-25
  • PHP文件上传一些小收获

    又码了一个周末的代码,这次在做一些关于文件上传的东西。(PHP UPLOAD)小有收获项目是一个BT种子列表,用户有权限上传自己的种子,然后配合BT TRACK服务器把种子的信息写出来...2016-11-25
  • AI源文件转photoshop图像变模糊问题解决教程

    今天小编在这里就来给photoshop的这一款软件的使用者们来说下AI源文件转photoshop图像变模糊问题的解决教程,各位想知道具体解决方法的使用者们,那么下面就快来跟着小编...2016-09-14
  • C++万能库头文件在vs中的安装步骤(图文)

    这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
  • Zend studio文件注释模板设置方法

    步骤:Window -> PHP -> Editor -> Templates,这里可以设置(增、删、改、导入等)管理你的模板。新建文件注释、函数注释、代码块等模板的实例新建模板,分别输入Name、Description、Patterna)文件注释Name: 3cfileDescriptio...2013-10-04
  • php文件上传你必须知道的几点

    本篇文章主要说明的是与php文件上传的相关配置的知识点。PHP文件上传功能配置主要涉及php.ini配置文件中的upload_tmp_dir、upload_max_filesize、post_max_size等选项,下面一一说明。打开php.ini配置文件找到File Upl...2015-10-21
  • ant design中upload组件上传大文件,显示进度条进度的实例

    这篇文章主要介绍了ant design中upload组件上传大文件,显示进度条进度的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-10-29
  • C#使用StreamWriter写入文件的方法

    这篇文章主要介绍了C#使用StreamWriter写入文件的方法,涉及C#中StreamWriter类操作文件的相关技巧,需要的朋友可以参考下...2020-06-25
  • php实现文件下载实例分享

    举一个案例:复制代码 代码如下:<?phpclass Downfile { function downserver($file_name){$file_path = "./img/".$file_name;//转码,文件名转为gb2312解决中文乱码$file_name = iconv("utf-8","gb2312",$file_name...2014-06-07
  • C#路径,文件,目录及IO常见操作汇总

    这篇文章主要介绍了C#路径,文件,目录及IO常见操作,较为详细的分析并汇总了C#关于路径,文件,目录及IO常见操作,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • 查找php配置文件php.ini所在路径的二种方法

    通常php.ini的位置在:复制代码 代码如下:/etc目录下或/usr/local/lib目录下。如果你还是找不到php.ini或者找到了php.ini修改后不生效(其实是没找对),请使用如下办法:1.新建php文件,写入如下代码复制代码 代码如下:<?phpe...2014-05-31