使用$ _GET中的多个参数过滤搜索结果

时间:2014-06-18 22:13:15

标签: php

我正在使用PHP中的分面搜索系统,该系统使用$_GET中的参数来过滤搜索结果。但是,我在返回正确的搜索结果时遇到问题。我的问题的核心围绕以下(错误的)代码:

$hits = results_from_db();
$results = array();

foreach ($hits as $hit) {

    if (isset($_GET['online']) && !in_array('online', $hit)){
         continue;
    } elseif (isset($_GET['on-site']) && !in_array('on-site', $hit)){
        continue;
    } elseif (isset($_GET['scheduled']) && !in_array('scheduled', $hit)){
        continue;
    } elseif (isset($_GET['on-demand']) && !in_array('on-demand', $hit)){
        continue;
    }

    $results[] = $hit;
}
return $results;

如果用户选择了多个选项 - 例如'online''scheduled' - 则$results应包含'online'和/或{{1}的所有匹配}} 包括的。如果用户没有选择任何选项,则应返回所有结果。

但是,在上面的代码中,如果选择了多个选项,结果将不会返回任何内容。

我觉得这是一个简单的逻辑问题,但我仍然难以接受。

1 个答案:

答案 0 :(得分:0)

根据我的评论,这听起来像数据库的工作,但这是一个解决方案:

if(
foreach ($hits as $hit) {

    $matches = false;

    if (isset($_GET['online']) && in_array('online', $hit)){
        $matches = true;
    } elseif (isset($_GET['on-site']) && in_array('on-site', $hit)){
        $matches = true;
    } elseif (isset($_GET['scheduled']) && in_array('scheduled', $hit)){
        $matches = true;
    } elseif (isset($_GET['on-demand']) && in_array('on-demand', $hit)){
        $matches = true;
    }

    if($matches){
        $results[] = $hit;
    }
}

根据您的评论编辑,完整的解决方案:

$hits = results_from_db();

$categories = array(
    'online',
    'on-site',
    'scheduled',
    'on-demand'
);

$optionSelected = false;

foreach ($categories as $cat) {
    if(isset($_GET[$cat])){
        $optionSelected = true;
        break;
    }
}
if(!$optionSelected){
    //return all data
    return $hits;
}
$results = array();

foreach ($hits as $hit) {
    $matches = false;
    foreach ($categories as $cat) {
        if (isset($_GET[$cat]) && in_array($cat, $hit)){
            $matches = true;
            break;
        }
    }
    if($matches){
        $results[] = $hit;
    }
}
return $results;

通过简单地添加到$ categories数组

,这也更容易扩展到包含未来的类别