You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 11:31:14