PHP glob函数遍历目录/文件夹方法介绍

 更新时间:2016年11月25日 17:22  点击:2016
如果说到php遍历目录我们很多朋友会想到是opendir与readdir了,这样就可以遍历目录并显示文件了,但在php中有一个更简洁的遍历目录的函数glob估计很少有人知道此函数,不过我觉得比起opendir与readdir要简单多了哦。

PHP glob函数的使用:glob — 寻找与模式匹配的文件路径

例子

 代码如下 复制代码

<?php
$fileList=glob('*.*');
for ($i=0; $i<count($fileList); $i++) {
echo $fileList[$i].'<br />';
}
$fileList2=glob('images/*');
for ($i=0; $i<count($fileList2); $i++) {
echo $fileList2[$i].'<br />';
}
$fileList3=glob('*');
for ($i=0; $i<count($fileList3); $i++) {
echo $fileList3[$i].'<br />';
}
?>


第一种:

glob函数的参数里面是:*.* ,意思是扫描当前目录下的文件,不包括文件夹,返回的是一个数组,以下二种情况一样。

第二种:

glob函数的参数里面是:images/* ,是指定目录扫描所有的文件,包括文件夹,也可以扫描指定的文件类型,如:images/*.jpg;注意,如果只输入:images只会返回该文件夹名称,如果只输入:images/则什么也不会返回;

第三种:

glob函数的参数里面是:* ,可以扫描出当前目录下的所有文件、目录及子目录的文件。

好我们再看看opendir与readdir遍历目录

 代码如下 复制代码

<?php
/**********************
一个简单的目录递归函数
第一种实现办法:用dir返回对象
***********************/
function tree($directory)
{
$mydir = dir($directory);
echo "<ul>\n";
while($file = $mydir->read())
{
if((is_dir("$directory/$file")) AND ($file!=".") AND ($file!=".."))
{
echo "<li><font color=\"#ff00cc\"><b>$file</b></font></li>\n";
tree("$directory/$file");
}
else
echo "<li>$file</li>\n";
}
echo "</ul>\n";
$mydir->close();
}
//开始运行

echo "<h2>目录为粉红色</h2><br>\n";
tree("./nowamagic");

/***********************
第二种实现办法:用readdir()函数
************************/
function listDir($dir)
{
if(is_dir($dir))
   {
if ($dh = opendir($dir))
{
   while (($file = readdir($dh)) !== false)
{
if((is_dir($dir."/".$file)) && $file!="." && $file!="..")
{
echo "<b><font color='red'>文件名:</font></b>",$file,"<br><hr>";
listDir($dir."/".$file."/");
}
else
{
if($file!="." && $file!="..")
{
echo $file."<br>";
 }
}
   }
   closedir($dh);
}
   }
}
//开始运行
listDir("./nowamagic");
?>

好了大家都看到子glob与opendir与readdir遍历输入的写法了,从代码简洁上来说glob是完胜了opendir与readdir了,在功能实现上达到的是相同的效果呀,所以推荐使用glob函数遍历目录吧

直接在php中的多文件上传我有介绍过很多并且也写过专题了,但是在thinkphp中多文件上传还是头一次碰到了,那么这个thinkphp多文件上传与php会有什么区别与共同点呢?下面我来给大家介绍一个Thinkphp框架实现多文件上传吧,希望对各位会有点帮助哦。

Thinkphp手册中对于多文件上传描述的很清楚:如果需要使用多个文件,只需要修改表单,把

 代码如下 复制代码

<input type='file' name='photo'>
改为

<li><input type='file' name='photo1'></li>
<li><input type='file' name='photo2'></li>
<li><input type='file' name='photo3'></li>
</ol>
或者

<li><input type='file' name='photo[]'></li>
<li><input type='file' name='photo[]'></li>
<li><input type='file' name='photo[]'></li>


暂且自己的上传表单域为两个,一个上传图片,一个上传视频。字段名为image、video。

html代码如下

 代码如下 复制代码

图片:<input type="file" name="image[]">
 
视频:<input type="file" name="video[]">
model代码:

protected $info= '';
 
protected $_auto = array(
array('image','upload',3,callback),//自动完成方法
array('video','videoupload',3,callback), //自动完成方法
);//自动填充上传图片生成缩略图
protected function upload(){
$var = $_FILES['image']['name'];
import('ORG.Net.UploadFile');
$upload = new UploadFile();
$upload->saveRule  = time;
$upload->allowExts  = array('jpg', 'gif', 'png', 'zip','flv');
$upload->thumb = true;
//视频路径。。。只支持flv后缀,
$upload->videopath = './Public/upload/Video/';
$upload->savePath =  './Public/upload/images/';
$upload->thumbPrefix = '250_115_,150_110_,213_156_';
$upload->thumbMaxWidth='250,150,213';
$upload->thumbMaxHeight='115,110,156';
if(!in_array('',$var) || !in_array('',$_FILES['video']['name'])){
if(!$upload->upload()) {
echo $upload->getErrorMsg();die;
}else{
$this->info =  $upload->getUploadFileInfo();
if(!in_array('',$var) &amp;&amp; !in_array('',$_FILES['video']['name'])){
return $this->info[1]['savename'];
}elseif(!in_array('',$var)){
return $this->info[0]['savename'];
}else{
return false;
}
 
}
}else{
return flase;
}
}
//上传视频
protected function videoupload(){
if(!in_array('',$var) &amp;&amp; !in_array('',$_FILES['video']['name'])){
return $this->info[0]['savename'];
}elseif(!in_array('',$_FILES['video']['name'])){
return $this->info[1]['savename'];
}else{
return false;
}
 
}

文章最后我来分析一下多文件上传原理吧,先来看看html代码

<li><input type='file' name='photo[]'></li>
<li><input type='file' name='photo[]'></li>
<li><input type='file' name='photo[]'></li>

这种就是把表单变量定义为数组,在php中数组特殊变量它可以存储多个不定长的内容,所以我们就可以自定多文件上传框了,那么在php处理时我们要如何操作,下面看例子。

protected $_auto = array(
array('image','upload',3,callback),//自动完成方法
array('video','videoupload',3,callback), //自动完成方法
);//自动填充上传图片生成缩略图

这个是告诉thinkphp是数组变量了,并不需要像原生态的php中来判断遍历数组长度再一个个上传的代码了,因为了thinkphp己经做好了。

php如果要批量保存数据我们只要使用sql的insert into语句就可能实现数据批量保存了,如果是更新数据使用update set就可以完成更新了,操作方法都非常的简单哦,下面整理两个例子。

批量数据录入

设计方法:同时提交多条表单记录,为每一条记录设置相同的文本域名称,然后在表单处理页中,通过for
循环来读取提取表单提交的数据,最后以数据的形式将数据逐条添加到数据库中。

其中,应用一个count()函数来获取数组中元素的个数。
int count(mixed var);


表单提交页面

 代码如下 复制代码

<form name="form1" method="post" action="index_ok.php">
<tr>
<td>商品名称</td>
<td>编号</td>
<td>单价</td>
<td>数量</td>
<td>产地</td>
<input name="data" type="hidden" value="<?php echo $data;?>">
</tr>

<tr>
<td><input name="sp_name[]" type="text" id="sp_name" size="15"></td>
<td><input name="sp_number[]" type="text" id="sp_number" size="10"></td>
<td><input name="price[]" type="text" id="price" size="8"></td>
<td><input name="counts[]" type="text" id="counts" size="8"></td>
<td><input name="address[]" type="text" id="address" size="15"></td>
</tr>

<input type="submit" name="submit" value="提交">
<input type="reset" name="reset" value="重置">
</form>

 

数据库连接页

<?php
$id=mysql_connect("localhost","root","password") or die('connection failed'.mysql_error());
if(mysql_select_db('mydatabase',$id))
echo "";
else
echo('select db failed:'.mysql_error());
?>


表单处理页
<?php session_start(); include("conn/conn.php");
if($submit==true){
    for($i=0;$i<count($sp_name);$i++){
        $path=$_POST["sp_name"][$i];
        $path1=$_POST["sp_number"][$i];
        $path2=$_POST["price"][$i];
        $path3=$_POST["counts"][$i];
        $path4=$_POST["address"][$i];
        $query=mysql_query("insert into tb_products(sp_name,sp_number,price,counts,address,data) values('$path','$path1','$path2','$path3','$path4','$data');}
    if($query==true){
        echo"提交成功";
    else
        echo"提交失败";}
}
?>

批量更新数据


主要通过while, list(),each()函数来实理数据的批量更新

list()函数用于一次性为多个变量赋值

 代码如下 复制代码

<?php session_start(); include("conn/conn.php");?>

<form name="form1" method="post" action="index_ok.php">
<?php $query="select * from tb_users";
          $result=mysql_query($query);
             if($result==true){
             while($myrow=mysql_fetch_array($result)){
?>
<tr>
<td><input name="<?php echo $myrow[id];?> type="checkbox" value="<?php echo $myrow[id]; ?></td>
<td><?php echo $myrow[user];?></td>
<td><?php echo $myrow[popedom];?></td>
<td><?php echo $myrow[operation];?></td>
</tr>
<?php }} ?>

<tr>
<input type="submit" name="submit" value="激活">
<input type="submit" name="submit2" value="冻结">
</tr>
</form>

表单处理页

<?php session_start(); include("conn/conn.php")

if($submit=="激活"){
    while(list($name,$value)=each($_POST)){
        $result=mysql_query("update tb_user set operation='激活' where id='".$name."'");
    if($result==true){
        echo "<script> alert('激活成功');window.location.href='index.php';</script>";}}

if($submit2=="冻结"){
    while(list($name,$value)=each($_POST)){
        $result=mysql_query("update tb_user set operation='冻结' where id='".$name."'");
    if($result==true){
        echo "<script> alert('冻结成功');window.location.href='index.php';</script>";}}
}
?>

总结,

心细的朋友会发现两个例子都有几个共同点,一个是表单from的表单名是以counts[]数组形式了,而在php处理接受页面都会使用for 或while来实现遍历了,下面我就简单的给大家分析这两个例子。

counts[]

这个在表单中是代表数组,如果你有10个表单那么我们name=counts[] 意思他们内个都是一样数组,知道这个是数组了就知道下面知道为什么会使用遍历了。

for 或while

因为表单过来的是数组我们就可以遍历数组然后对数据进行保存了,如下代码

while(list($name,$value)=each($_POST)){
      

for($i=0;$i<count($sp_name);$i++){

两个实现结果是一样的的哦。

我的这个功能的原因是参考dedecms生成html页面的原理,只是dedecms使用的是js跳转而我使用的是refresh进行跳转,效果是一样的,下面我们一起来看一个php实现批量导入数据的方法

因为我有1000W数据一次导入数据库肯定是不可行了,所以我就导致了每一次导入50条或更多数据,然后下次再刷新一次这样就可以解决这个问题了,代码如下

 代码如下 复制代码

<?
set_time_limit(0);
//连接数据库

$s = isset( $_GET['s'] )?$_GET['s']:0;
$e = isset( $_GET['e'])?$_GET['e']:50;
$count =85000;

if( $s < $count )
{
 $sql = "select * from bac_info where isget =0 order by id desc limit $s,$e ";
 $query = mysql_query( $sql );
 while( $rs = mysql_fetch_array( $query ) )
 {
  $id = $rs['id'];
  $sms = $rs['sms'];
  $typeid = $rs['typeid'];
  $isget = $rs['isget'];
  $sql = "insert into bac_info_bak (id,sms,typeid,isget) values('$id','$sms','$typeid','$isget')";
  mysql_query( $sql ) ;
  echo $sql;
  //exit;
  $sqlu = "update bac_info set isget=1 where id =".$rs['id'];
  mysql_query( $sqlu );
 }
 echo '<meta http-equiv="refresh" content="0;url=rand.php?s='.($s+50).'&e=50">正在处理数据,当前为'.$s.'条......';
}
else
{
 echo '完成所有数据处理 <a href=rand.php>再随机排序一次</a>';
}
?>

在php中获取页面URL文章我都介绍过了几十次了,但今天发现有一个非常不错的处理函数,下面给大家介绍一下。

在PHP中,没有默认的Function来获取目前所在页面的URL,所以今天就向大家介绍一个在PHP获取当前页面完整URL的PHP函数
代码

函数代码如下,调用时只需要使用 curPageURL() 就行啦!

 代码如下 复制代码

/* 获得当前页面URL开始 */
function curPageURL() {
    $pageURL = 'http';
    if ($_SERVER["HTTPS"] == "on") {    // 如果是SSL加密则加上“s”
        $pageURL .= "s";
    }
    $pageURL .= "://";
    if ($_SERVER["SERVER_PORT"] != "80") {
        $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
    } else {
        $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
    }
    return $pageURL;
}
/* 获得当前页面URL结束 */

补充一下server参数说明

 代码如下 复制代码

//获取域名或主机地址
echo $_SERVER['HTTP_HOST']."<br>"; #localhost

//获取网页地址
echo $_SERVER['PHP_SELF']."<br>"; #/blog/testurl.php

//获取网址参数
echo $_SERVER["QUERY_STRING"]."<br>"; #id=5

//获取用户代理
echo $_SERVER['HTTP_REFERER']."<br>";

//获取完整的url
echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'];
#http://localhost/blog/testurl.php?id=5

//包含端口号的完整url
echo 'http://'.$_SERVER['SERVER_NAME'].':'.$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
#http://localhost:80/blog/testurl.php?id=5

//只取路径
$url='http://'.$_SERVER['SERVER_NAME'].$_SERVER["REQUEST_URI"];
echo dirname($url);
#http://localhost/blog

[!--infotagslink--]

相关文章

  • php正确禁用eval函数与误区介绍

    eval函数在php中是一个函数并不是系统组件函数,我们在php.ini中的disable_functions是无法禁止它的,因这他不是一个php_function哦。 eval()针对php安全来说具有很...2016-11-25
  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • Python astype(np.float)函数使用方法解析

    这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08
  • Python中的imread()函数用法说明

    这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
  • php获取一个文件夹的mtime的程序

    php获取一个文件夹的mtime的程序了,这个就是时间问题了,对于这个问题我们来看小编整理的几个例子,具体的操作例子如下所示。 php很容易获取到一个文件夹的mtime,可以...2016-11-25
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • 金额阿拉伯数字转换为中文的自定义函数

    CREATE FUNCTION ChangeBigSmall (@ChangeMoney money) RETURNS VarChar(100) AS BEGIN Declare @String1 char(20) Declare @String2 char...2016-11-25
  • C++中 Sort函数详细解析

    这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • PHP用strstr()函数阻止垃圾评论(通过判断a标记)

    strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。语法:strstr(string,search)参数string,必需。规定被搜索的字符串。 参数sea...2013-10-04
  • PHP函数分享之curl方式取得数据、模拟登陆、POST数据

    废话不多说直接上代码复制代码 代码如下:/********************** curl 系列 ***********************///直接通过curl方式取得数据(包含POST、HEADER等)/* * $url: 如果非数组,则为http;如是数组,则为https * $header:...2014-06-07
  • php中的foreach函数的2种用法

    Foreach 函数(PHP4/PHP5)foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。...2013-09-28
  • C语言中free函数的使用详解

    free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
  • PHP函数strip_tags的一个bug浅析

    PHP 函数 strip_tags 提供了从字符串中去除 HTML 和 PHP 标记的功能,该函数尝试返回给定的字符串 str 去除空字符、HTML 和 PHP 标记后的结果。由于 strip_tags() 无法实际验证 HTML,不完整或者破损标签将导致更多的数...2014-05-31
  • PHP加密解密函数详解

    分享一个PHP加密解密的函数,此函数实现了对部分变量值的加密的功能。 加密代码如下: /* *功能:对字符串进行加密处理 *参数一:需要加密的内容 *参数二:密钥 */ function passport_encrypt($str,$key){ //加密函数 srand(...2015-10-30
  • SQL Server中row_number函数的常见用法示例详解

    这篇文章主要给大家介绍了关于SQL Server中row_number函数的常见用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-08
  • 浅析Promise的介绍及基本用法

    Promise是异步编程的一种解决方案,在ES6中Promise被列为了正式规范,统一了用法,原生提供了Promise对象。接下来通过本文给大家介绍Promise的介绍及基本用法,感兴趣的朋友一起看看吧...2021-10-21
  • php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法

    最近遇到一个问题,就是在使用php的mail函数发送utf-8编码的中文邮件时标题出现乱码现象,而邮件正文却是正确的。最初以为是页面编码的问题,发现页面编码utf-8没有问题啊,找了半天原因,最后找到了问题所在。 1.使用 PEAR 的...2015-10-21
  • C#中加载dll并调用其函数的实现方法

    下面小编就为大家带来一篇C#中加载dll并调用其函数的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25