php文件路径中的多个搜索值


php multiple search values in file path

我正在开发一个php站点,该站点需要使用任意搜索字段组合来搜索一组文件。

可能的搜索字段是

id,年份,建筑物,姓氏,名字,出生日期

文件夹结构和文件名如下

/年份/建筑/文件.pdf

文件名包含要搜索的数据

id_lastname_firstname_MM_dd_yy.pdf

除了这一部分,我在网站上的所有工作都在进行。最初我只有身份证、年份和建筑,我可以做if来检查各种组合的可能性。现在有更多的组合,所以它更加复杂。

我在想嵌套if和in_array之类的,但必须有更好的方法。我只是在学习php。

我希望能够使用任何字段组合进行搜索。如果有帮助的话,我可以更改文件名。

我从这个开始

function search($transcripts, $studentid=null, $year=null, $building=null, $last=null, $first=null, $birthdate=null){
$ext = '.pdf';
date_default_timezone_set('America/Los_Angeles');
$dir_iterator = new RecursiveDirectoryIterator("../transcripts");
$iterator = new RecursiveIteratorIterator($dir_iterator, RecursiveIteratorIterator::SELF_FIRST);
foreach ($iterator as $file) {
    if ($file->isFile()){
        $path = explode('''',$file->getPath());
        $fname = explode('_', $file->getBasename($ext));
        if($path[1] == $year){
            if($path[2] == $building){
                if(in_array($last, $fname, true)){
                    if((in_array($first, $fname, true)){
                        if((in_array($birthdate

最初,我有独立的功能,这取决于哪些字段在哪里归档。

function bldStuSearch($building, $studentid, $transcripts){
$ext = '.pdf';
date_default_timezone_set('America/Los_Angeles');
$dir_iterator = new RecursiveDirectoryIterator("../transcripts");
$iterator = new RecursiveIteratorIterator($dir_iterator, RecursiveIteratorIterator::SELF_FIRST);
foreach ($iterator as $file) {
        $results = explode('''',$file->getPath());
        //var_dump($results);
    if (($file->isFile()) && ($file->getBasename($ext)==$studentid) && ($results[2] == $building)){
        //echo substr($file->getPathname(), 27) . ": " . $file->getSize() . " B; modified " . date("Y-m-d", $file->getMTime()) . "'n";
        $results = explode('''',$file->getPath());
        //var_dump($results);
        //$building = $results[2];
        $year = $results[1];
        //$studentid = $file->getBasename($ext);
        array_push($transcripts, array($year, $building, $studentid));
        //var_dump($transcripts);
        //$size += $file->getSize();
        //echo '<br>';
    }
}
//echo "'nTotal file size: ", $size, " bytes'n";
if (empty($transcripts))
{
    header('Location: index.php?error=2'); exit();
}
return $transcripts;

}

现在我正在尝试使用一个搜索功能来检查任何组合?有什么想法至少会朝着正确的方向发展吗?

谢谢。

所以我有一个关于建立评分系统的想法,但后来放弃了。我重新开始,找到了一种使用加权评分系统的方法。

这使得搜索非常灵活,并保持可移植性,不需要元数据数据库,也不需要使用文件名作为搜索数据,而不必搜索每个PDF。我使用A-Pdf拆分器将Pdf拆分为单独的文件,并将元数据添加到文件名中。

我希望有一天有人发现这对其他搜索有用。结果我真的很高兴。

我将在上完成后发布整个代码http://github.com/friedcircuits

我应该更改的一件事是对数组使用命名键。

这是生成的代码。现在,出生日期必须输入为m-d-yyyy才能匹配。

function search($transcripts, $studentid=null, $year=null, $building=null, $last=null, $first=null, $birthdate=null){
$ext = '.pdf';
$bldSearch = false;
date_default_timezone_set('America/Los_Angeles');
if (($building == null) AND ($year == null)){ $searchLocation = "../transcripts";}
elseif (($year != null) AND ($building != null)){$searchLocation = "../transcripts/".$year."/".$building;}
elseif ($year != null) {$searchLocation = "../transcripts/".$year;}
elseif ($building != null) {
    $searchLocation = "../transcripts/";
    $bldSearch = true;
}
else{$searchLocation = "../transcripts";}
$dir_iterator = new RecursiveDirectoryIterator($searchLocation);
$iterator = new RecursiveIteratorIterator($dir_iterator, RecursiveIteratorIterator::SELF_FIRST);
$score = 0;
foreach ($iterator as $file) {
    if ($file->isFile()){
        //Fix for slashes changing direction depending on search path
        $path = str_replace('/','''', $file->getPath());
        $path = explode('''',$path);
        $fname = explode('_', $file->getBasename($ext));
        //var_dump($path);
        //echo "<br>";
        //var_dump($fname);
        //echo "<br>";
        //fix for different search paths
        if($path[1] == "transcripts"){
            $pYear = $path[2];
            $pbuilding = $path[3];
        }
        else{
            $pYear = $path[1];
            $pbuilding = $path[2];
        }
        if ($bldSearch == true){
            if ($building != $pbuilding) {continue;}
        }

        //$fname[1] = @strtolower($fname[1]);
        //$fname[2] = @strtolower($fname[2]);

        if($fname[0] == $studentid){
            $yearS = $pYear;
            $buildingS = $pbuilding;
            $studentidS = $fname[0];
            $lastS = $fname[1];
            $firstS = $fname[2];
            $birthdateS = $fname[3];
            array_push($transcripts, array($yearS, $buildingS, $studentidS, $lastS, $firstS, $birthdateS));
            continue;
        }
        if($pYear == $year){
            $score += 1;
        }
        if($path[2] == $building){
            $score += 1;
        }
        if(@strpos(@strtolower($fname[1]),$last) !== false){
            $score += 3;
        }
        if(@strpos(strtolower($fname[2]), $first) !== false){
            $score += 3;
        }
        if($fname[3] == $birthdate){
            $score += 3;
        }
        //echo $score." ";
        if ($score > 2) {
            $yearS = $pYear;
            $buildingS = $pbuilding;
            $studentidS = $fname[0];
            $lastS = $fname[1];
            $firstS = $fname[2];
            $birthdateS = $fname[3];
            array_push($transcripts, array($yearS, $buildingS, $studentidS, $lastS, $firstS, $birthdateS)); 
            //var_dump($transcripts);
        }
    }
    $score = 0;
}
if (empty($transcripts))
{
    header('Location: index.php?error=2'); exit();
}

return $transcripts;}