在递归计算目录数目,文件数目,目录大小等功能中,我们常用的方式是使用递归来实现。但是,递归实现因为会不断向调用堆栈中存入数据(包括当前执行的状态变量等数据),实际上会大量占用内存空间,同时执行时间也会受到影响。
我们通过一个保存目录路径的队列,可以很优雅地实现非递归的目录遍历,下面我们通过递归统计目录数量的功能给出示例:
<?php
/*
*
* 非递归方式实现目录数量统计
*/
$dir = '/home/****';
function sumDir($dir)
{
$queue = [$dir];
$sum = 0;
while ($current = each($queue)) {
// echo 'aaa---';
$currentDir = $current['value'];
// var_dump($currentDir);
if (is_dir($currentDir)) {
// echo 'bb';
$handle = opendir($currentDir);
while ($file = readdir($handle)) {
// echo $file.'<br>';
if ($file == '.' || $file == '..') {
continue;
}
if (is_dir($currentDir.'/'.$file)) {
$sum++;
// echo $sum;
$queue[] = $currentDir.'/'.$file;
}
}
closedir($handle);
}
}
return $sum;
}
var_dump(sumDir($dir));