如何在PHP数组中查找重复文件名并显示其所在目录
问题描述
我有一个存储硬盘所有文件路径的PHP数组,示例如下:
$files = Array( [0] => E:\\folder1\file1.mp4 [1] => E:\\folder1\folder1a\file2.mp4 [2] => E:\\folder2\folder2a\file3.avi [3] => E:\\folder2\folder2a\file4.avi [4] => E:\\folder2\folder2a\file5.avi [5] => E:\\folder2\folder2a\file6.avi [6] => E:\\folder2\folder2a\file7.avi [7] => E:\\folder2\folder2a\file8.mkv [8] => E:\\folder2\folder2a\file9.avi [9] => E:\\folder2\folder2a\file10.avi [10] => E:\\folder2\folder2a\file1.mp4 ... [2345] => E:\\folder324\folder324a\folder324aa\file5456789.mp4 );
我希望在该数组中查找所有重复的文件名(忽略大小写和所在目录),并通过echo输出如下格式的内容:
file1.mp4 is duplicated in: E:\\folder1\ E:\\folder2\\folder2a\\
我尝试了以下代码,但不知道如何获取并显示文件所在的目录:
foreach($files as $ind => $c) { $name = basename($c); $dups[] = $name; } foreach (array_count_values($dups) as $indd => $rty) { if ($rty > 1) echo $indd . " is duplicated in: <br/>"; }
解决方案
调整数组存储结构,把文件名(小写)作为键,对应目录路径作为值存储,就能轻松关联重复文件的所有目录。以下是实现代码:
// 初始化存储文件名与对应目录的数组 $fileDirMap = []; foreach ($files as $filePath) { // 文件名转小写,实现忽略大小写匹配 $lowerFileName = strtolower(basename($filePath)); // 获取文件所在目录,追加目录分隔符保证格式统一 $fileDir = dirname($filePath) . DIRECTORY_SEPARATOR; // 已有该文件名则追加目录,无则新建条目 if (isset($fileDirMap[$lowerFileName])) { $fileDirMap[$lowerFileName][] = $fileDir; } else { $fileDirMap[$lowerFileName] = [$fileDir]; } } // 遍历输出重复文件信息 foreach ($fileDirMap as $lowerName => $dirs) { if (count($dirs) > 1) { // 这里直接用小写文件名输出,若要保留原大小写可参考下方优化代码 echo $lowerName . " is duplicated in:<br/>"; foreach ($dirs as $dir) { echo $dir . "<br/>"; } echo "<br/>"; // 分隔不同重复文件 } }
优化说明(保留原文件名大小写)
如果需要输出原文件名的原始大小写,可修改存储结构,同时记录原文件名和目录:
$fileDirMap = []; foreach ($files as $filePath) { $originalName = basename($filePath); $lowerFileName = strtolower($originalName); $fileDir = dirname($filePath) . DIRECTORY_SEPARATOR; if (isset($fileDirMap[$lowerFileName])) { $fileDirMap[$lowerFileName]['dirs'][] = $fileDir; } else { $fileDirMap[$lowerFileName] = [ 'original_name' => $originalName, 'dirs' => [$fileDir] ]; } } foreach ($fileDirMap as $data) { if (count($data['dirs']) > 1) { echo $data['original_name'] . " is duplicated in:<br/>"; foreach ($data['dirs'] as $dir) { echo $dir . "<br/>"; } echo "<br/>"; } }
内容的提问来源于stack exchange,提问作者smal
相关产品推荐
相关产品推荐

