Правильный способ реализации фильтра категорий - PullRequest
0 голосов
/ 24 декабря 2011

Я действительно смущен тем, как мне следует подходить / реализовывать функцию фильтра.

Так что я простой флажок с 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;

Я пытался сделатьa

$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 ]

1 голос
/ 24 декабря 2011

Если я правильно понимаю, вы должны указать каждый val # в переключателе и использовать 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
}
}
0 голосов
/ 26 декабря 2011

Хорошо, вот решение, которое работает для меня

$filterData = explode(',', $parameters['filter']);
     foreach ($filterData as $key => $value)
     {
             switch($value)
             {
                 case $value:
                     $value = '_'.$value;
                     $searchResults[$value] = $this->$value($parameters);
                 break;
             }
     }
0 голосов
/ 26 декабря 2011

Если я понял вопрос, проблема в том, что в операторе switch условие оценивается только один раз, а результат сравнивается с каждым оператором case. Следовательно, оператор switch просто не соответствует тому, что вы запрашиваете, потому что он просто оценивает первое совпадающее значение (как вы и упоминали). Вместо этого просто используйте простой if внутри цикла foreach, например:

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

}
0 голосов
/ 24 декабря 2011

Правильный способ реализации фильтра категорий обычно на уровне базы данных с использованием оператора In.

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

Если вы действительно должны сделать это на уровне PHP, я предлагаю использовать итератор / цикл для проверки каждого результата с чем-то вроде http://php.net/manual/en/function.in-array.php в вашем наборе и добавитьэто в новый массив.Это будет намного медленнее, чем на уровне базы данных.

...