PHP搜索结果去重:如何去除目录搜索中的重复路径
问题与解决方案
问题描述
我在当前目录下,需要检查上级目录(../)中是否存在名称为$taxon的子目录,找到后仅显示唯一的目录路径。但当前运行PHP脚本后,因目标目录下的文件导致同一目录路径被重复输出,示例输出如下:
..\gallery_01\298089-2<br />..\gallery_01\298089-2
..\gallery_02a\298089-2<br />..\gallery_02a\298089-2
..\gallery_03bb\298089-2<br />..\gallery_03bb\298089-2\
原脚本代码:
<?php $taxon = '298089-2'; $dir = '../'; //path of the directory to read $iterator = new RecursiveDirectoryIterator($dir); foreach (new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::LEAVES_ONLY) as $file) { if (!$file->isFile()) { $a=array($file); // we check whether the value of the $taxon variable is in the access path string foreach($a as $value ) { $szukany = strpos ($value, $taxon); if ($szukany != null) { echo "<BR><a href=". $file->getPath().">" . $file->getPath() . "\</a><BR>"; } } } } ?>
最简解决方案
问题根源:使用RecursiveIteratorIterator::LEAVES_ONLY会遍历目录下的所有文件,每个文件都会触发一次路径匹配,导致同一目录被重复输出;同时原脚本用strpos匹配路径字符串,可能误匹配路径中包含目标名称的其他目录。
以下是优化后的代码,确保每个目标目录仅输出一次:
<?php $taxon = '298089-2'; $dir = '../'; $foundDirs = []; // 记录已找到的目录,避免重复输出 // 跳过.和..目录,减少无效遍历 $iterator = new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS); foreach (new RecursiveIteratorIterator($iterator) as $item) { // 仅匹配目录名完全等于$taxon的目录 if ($item->isDir() && $item->getBasename() === $taxon) { $dirPath = $item->getPathname(); // 检查目录是否已输出过 if (!isset($foundDirs[$dirPath])) { $foundDirs[$dirPath] = true; echo "<br><a href=\"$dirPath\">$dirPath</a><br>"; } } } ?>
优化点说明
- 加入
RecursiveDirectoryIterator::SKIP_DOTS,跳过当前目录(.)和上级目录(..),减少不必要的遍历 - 直接判断目录的
basename是否完全等于$taxon,避免路径中包含目标名称的其他目录被误匹配 - 使用数组键存储已输出的目录路径,判断重复的效率更高,确保每个目录仅输出一次
内容的提问来源于stack exchange,提问作者tropiciel
相关产品推荐
相关产品推荐

