搜尋
首頁php教程php手册PHP教程:不用递归遍历目录下的文件

PHP教程:不用递归遍历目录下的文件

Jun 13, 2016 am 11:40 AM
php子目錄教學文件遞迴遍歷

如果要遍历某个目录下的所有文件(包括子目录),最首先想到的思路就是用递归:先处理当前目录,再处理当前目录下的子目录。不用递归可不可以呢?以前学数据结构的时候看到过,递归其实是利用堆栈来实现的,递归的特点就是不断的调用自身,最后一次的调用是最先执行完的,倒数第二次调用是其次执行完的,依次类推,最初的调用是最后执行完的。如果理解了递归的原理,其实就可以把所有用递归的实现转化为非递归的实现。

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

1. 创建一个数组,将要遍历的这个目录放入;(其实就是创建了一个栈)

2. 循环处理这个数组,循环结束的条件是数组为空;

3. 每次循环,处理数组中的一个元素,并将元素删除,如果这个元素是目录,则将目录下所有的子元素加入数组;

按照这种思路写出的代码如下:

Copy to Clipboard引用的内容:[www.bkjia.com] /**
* 遍历某个目录下的所有文件
* @param string $dir
* from bkjia.com
*/
function scanAll($dir)
{
$list = array();
$list[] = $dir;

while (count($list) > 0)
{
//弹出数组最后一个元素
$file = array_pop($list);

//处理当前文件
echo $file."\r\n";

//如果是目录
if (is_dir($file))
{
$children = scandir($file);
foreach ($children as $child)
{
if ($child !== '.' && $child !== '..')
{
$list[] = $file.'/'.$child;
}
}
}
}
}

这里我并没有认为递归有多大的缺点,事实上很多情况下,用递归来设计还是非常简洁可读的,至于效率问题,除非在递归深度特别大的时候,才会有影响。

以下是用递归的实现,作为对比:

Copy to Clipboard引用的内容:[www.bkjia.com] /**
* 遍历某个目录下的所有文件(递归实现)
* @param string $dir
*/
function scanAll2($dir)
{
echo $dir."\r\n";

if (is_dir($dir))
{
$children = scandir($dir);
foreach ($children as $child)
{
if ($child !== '.' && $child !== '..')
{
scanAll2($dir.'/'.$child);
}
}
}
}
// bkjia.com

运行发现,两个函数的结果略有不同,主要表现在打印的顺序上。函数一运行结果的顺序是倒着的,是因为压栈的顺序正好和scandir出来的顺序相反了,可以将第21行改一下:

Copy to Clipboard引用的内容:[www.bkjia.com] $children = array_reverse(scandir($file));

这样出来结果就完全相同了。

本文来源:http://blog.quanhz.com/archives/210

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),