金沙js8331PHP不用递归遍历目录下所有文件的代码_php实例_脚本之家

/** * PHP 非递归实现查询该目录下所有文件 * @param unknown $dir * @return multitype:|multitype:string */function scanfiles { if  return array (); // 兼容各操作系统 $dir = rtrim ( str_replace , '/' ) . '/'; // 栈,默认值为传入的目录 $dirs = array ; // 放置所有文件的容器 $rt = array (); do { // 弹栈 $dir = array_pop ; // 扫描该目录 $tmp = scandir ; foreach  { // 过滤. .. if ($f == '.' || $f == '..') continue; // 组合当前绝对路径 $path = $dir . $f; // 如果是目录,压栈。 if  { array_push ; } else if  { // 如果是文件,放入容器中 $rt [] = $path; } } } while ; // 直到栈中没有目录 return $rt;}

附另后生可畏篇:不用递归遍历目录下的文书

金沙js8331,只要要遍历某些目录下的具有文件,最首先想到的思绪就是用递归:先拍卖当前目录,再管理当前目录下的子目录。不用递归可不得以啊?以前学数据布局的时候看见过,递归其实是接纳货仓来落实的,递归的特征就是持续的调用本人,最终一回的调用是初次奉行完的,倒数第三回调用是次要实施完的,依次类推,最先的调用是最终实行完的。如若知道了递归的准绳,其实就足以把装有用递归的落实转变为非递归的完结。

用非递归方式遍历有个别目录下的富有文件,思路首要分三步:

  1. 创办叁个数组,将在遍历的这些目录放入;2.
    巡回管理这么些数组,循环停止的尺码是数组为空;3.
    老是循环,管理数组中的一个成分,并将成分删除,借使这么些成分是目录,则将引得下具备的子成分参与数组;

据守这种思路写出的代码如下:

/** * 遍历某个目录下的所有文件 * @param string $dir */function scanAll{ $list = array(); $list[] = $dir; while  { //弹出数组最后一个元素 $file = array_pop; //处理当前文件 echo $file."rn"; //如果是目录 if  { $children = scandir; foreach  { if ($child !== '.' && $child !== '..') { $list[] = $file.'/'.$child; } } } }}

此地自身并未认为递归有多大的瑕玷,事实上超级多气象下,用递回来设计如故特别简单可读的,至于效能难点,除非在递归深度非常大的时候,才会有影响。

以下是用递归的完结,作为相比较:

/** * 遍历某个目录下的所有文件 * @param string $dir */function scanAll2{ echo $dir."rn"; if  { $children = scandir; foreach  { if ($child !== '.' && $child !== '..') { scanAll2; } } }}

运营发现,七个函数的结果略有不一样,首要表今后打字与印刷的各样上。函数一运作结果的逐个是倒着的,是因为压栈的逐个刚好和scandir出来的依次相反了,能够将第21行改一下:

$children = array_reverse;

如此出来结果就完全相似了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注