PHP面试之文件夹下内容重复的文件去重

3 篇文章 0 订阅

今天下午复试,面试官引导我写出文件夹下内容重复的文件去重。然后自己在黑板上写了好久没理清楚,现在写出来了,记录一下,如有不对,请各位大佬指出,或者有更好的方式请指导

首先用到md5_file()因为之前也没接触过这个函数 在这里看下手册

md5_file() 函数计算文件的 MD5 散列。
md5_file() 函数使用 RSA 数据安全,包括 MD5 报文摘要算法。
来自 RFC 1321 的解释 - MD5 报文摘要算法:MD5 报文摘要算法将任意长度的信息作为输入值,并将其换算成一个 128 位长度的"指纹信息"或"报文摘要"值来代表这个输入值,并以换算后的值作为结果。MD5 算法主要是为数字签名应用程序而设计的;在这个数字签名应用程序中,较大的文件将在加密(这里的加密过程是通过在一个密码系统下[如:RSA]的公开密钥下设置私有密钥而完成的)之前以一种安全的方式进行压缩。    

这里有两种写法
大神写给我的

class filesss
{
    private $files = [], $other = [] ,$directory = 'F:/phpstudy/WWW/test';

    public function getFiles($directory = '')
    {
        $dirHandle = opendir($this->directory);  
        if(!$dirHandle) contniue;
        while(($file = readdir($dirHandle)) !== false)
        {
            if($file != '.' && $file != '..')
            {
                $path = $directory.$file;

                if(is_file($path)) 
                {
                    $md5_file = md5_file($path);
                    if(!isset($this->files[$md5_file])) 
                        $this->files[$md5_file] = $path;
                    else 
                        $this->other[$md5_file][] = $path;
                }
                elseif(is_dir($path))
                {


                    $xxxxx = $this->getFiles($path.DIRECTORY_SEPARATOR);
                       if(is_array($xxxxx) && !empty($xxxxx))
                    {
                        if(!empty($xxxxx['file'])) $files = array_merge($files,$xxxxx['files']);
                        if(!empty($xxxxx['other'])) $files = array_merge($files,$xxxxx['other']);   
                    }
                }
            }
        }

        return ['files'=>$this->files,'other'=>$this->other];
    }
}

$files = (new filesss())->getFiles();
echo "<pre>";
print_r($files);

一个是我写的

 $dir = "F:/phpstudy/WWW/test";  //要获取的目录
 //$dir = "F:/phpstudy/WWW"; 
function deepScanDir($dir) {
    $fileArr = array ();
    $dirArr = array ();
    $arr = array();
    $newarray = array();
    $dir = rtrim($dir, '//');
    if (is_dir($dir)) {
        $dirHandle = opendir($dir);
        while (false !== ($fileName = readdir($dirHandle))) {
            $subFile = $dir . DIRECTORY_SEPARATOR . $fileName;
             if (is_file($subFile)) {
                $fileArr[$subFile] = md5_file($subFile);
            } elseif (is_dir($subFile) && str_replace('.', '', $fileName) != '') {

                $dirArr[] = $subFile;
                $arr = deepScanDir($subFile);
                //$dirArr = array_merge($dirArr, $arr['dir']);
                $fileArr = array_merge($fileArr, $arr['file']);


            }

        }
        closedir($dirHandle);
    }

  return array (
       // 'dir' => $dirArr,
        'file' => $fileArr
    );

}
echo "<pre>";
$file=deepScanDir($dir);
print_r($file);
print_r(array_unique($file['file'])); 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值