实现类别过滤器的正确方法

时间:2011-12-24 00:45:40

标签: php foreach switch-statement

我对如何处理/实现过滤器功能感到困惑。

所以我是一个简单的复选框,有4个值:val1,val2,val3,val4,它们必须像一个类别过滤器。如果用户选择val1,则val3将仅显示该类别的结果。

好的问题是如何在后端实现此功能。我认为最好的想法是使用switch函数,但问题是$ filterData以这种格式带来值:val1,val3,val4所以一个开关和一个案例都可以工作。

我正在考虑使用','作为胶水试图破坏它,但是从我尝试过,直到现在我还没有成功。

它应该像这样工作

switch ($filterData)
{
      case 'Values of filter data' (ex: val3 and val4 ):
          $result[$value.'Results'] = $this->_$value($data);
      break;
}
return $result;

我试过做

$filterData = implode(',',$filterData);
foreach ($filterData as $key => $value)
{
     switch ($value){
         case $value:
              $result[$value.'Results'] = $this->_$value($data);
         break;}
}

但问题是这会返回:

Array
(
    [value1Results] => value1
)

Array
(
    [value1Results] => value1
    [value2Results] => value2
)

Array
(
    [value1Results] => value1
    [value2Results] => value2
    [value3Results] => value3
)

任何想法如何实施/解决这个问题?

4 个答案:

答案 0 :(得分:1)

如果我理解正确,您必须在交换机中指定每个值#并使用switch($key)而不是switch($value);

//page.php?val1=value1&val3=value3

$filterData = $_GET; //for example

foreach ($filterData as $key => $value)
{
     switch ($key) {
         case 'val1':
         case 'val3':
              $result[$value.'Results'] = $this->_$value($data);
         break;
         //continue
}
}

答案 1 :(得分:0)

实现类别过滤器的正确方法通常是使用In语句在数据库级别。

http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_in

如果您真的必须在PHP级别执行此操作,我建议使用itterator / loop来检查每个结果,如集合中的http://php.net/manual/en/function.in-array.php,并将其添加到新数组中。这比在数据库级别这样做要慢得多。

答案 2 :(得分:0)

如果我理解了这个问题,那么问题是在switch语句中,条件只被评估一次,结果将与每个case语句进行比较。因此,switch语句不符合您的要求,因为它只是评估第一个匹配值(正如您所提到的那样,这就是您所遇到的)。相反,只需在foreach循环中使用一个简单的if,就像这样:

//initialize result
foreach ($filterData as $key => $value)
{
   if ($key)=='val1':
   //append this category results to the result

}

答案 3 :(得分:0)

好的,这是适用于我的解决方案

$filterData = explode(',', $parameters['filter']);
     foreach ($filterData as $key => $value)
     {
             switch($value)
             {
                 case $value:
                     $value = '_'.$value;
                     $searchResults[$value] = $this->$value($parameters);
                 break;
             }
     }