遍历目录的非递归实现

在递归计算目录数目,文件数目,目录大小等功能中,我们常用的方式是使用递归来实现。但是,递归实现因为会不断向调用堆栈中存入数据(包括当前执行的状态变量等数据),实际上会大量占用内存空间,同时执行时间也会受到影响。
我们通过一个保存目录路径的队列,可以很优雅地实现非递归的目录遍历,下面我们通过递归统计目录数量的功能给出示例:

$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.'
'
; if ($file == '.' || $file == '..') { continue; } if (is_dir($currentDir.'/'.$file)) { $sum++; // echo $sum; $queue[] = $currentDir.'/'.$file; } } closedir($handle); } } return $sum; } var_dump(sumDir($dir));

你可能感兴趣的:(PHP)