我正在使用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}的所有匹配}} 包括的。如果用户没有选择任何选项,则应返回所有结果。
但是,在上面的代码中,如果选择了多个选项,结果将不会返回任何内容。
我觉得这是一个简单的逻辑问题,但我仍然难以接受。
答案 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数组
,这也更容易扩展到包含未来的类别