遍历目录的非递归实现

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

<?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));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值