Функция фильтра - PullRequest
       14

Функция фильтра

0 голосов
/ 08 марта 2012

У меня есть функция фильтра, которая должна проверять два "поля" в массиве, это холодные name и description .

У меня также есть слова, хранящиеся в базе данных, и функция фильтра должна принимать определенные слова (true) и отклонять определенные слова (false).

Пример: Каждый пост, содержащий слово car , должен быть принят.

В базе данных я сохранил следующие слова, которые принимаются: машина (очевидно)

Не принято: грузовая машина Traktor BUSS

Итак, у меня есть функция, которая должна пройти через два поля ( name и description ) в массиве, сопоставить их со словами, хранящимися в базе данных, и проверить, Поля содержат допустимое слово или любое из неприемлемых слов.

Моя функция выглядит так $ arr = входящий массив с полями name и description . $ a ['value'] = Если оно равно 0, слово не принимается, если оно равно 1, слово принимается. $ a ['filter'] = Слово из базы данных.

function checkFilter($arr)
{
    $name = strtolower($arr['name']);
    $description = strtolower($arr['description']);

    $dbh = $this->connect();    
    $rs = $dbh->prepare("SELECT * FROM filter");
    $rs->execute();
    $all = $rs->fetchAll();

foreach($all as $a)
{
    if($a['value'] == 0 && strstr($name, strtolower($a['filter']), true))
    {
        return false;
        break;
    }

    if($a['value'] == 0 && strstr($description, strtolower($a['filter']), true))
    {
        return false;
        break;
    }

    if($a['value'] == 1 && strstr($name, strtolower($a['filter']), true))
    {
        return true;
        break;
    }

    if($a['value'] == 1 && strstr($description, strtolower($a['filter']), true))
    {
        return true;
        break;
    }
}
return false;       
}

Как вы уже поняли, я думаю, что если появятся какие-то из неприемлемых слов, я хочу вернуть false из функции и прервать ее. Это потому, что не имеет значения, находится ли принятое слово в name или description , если непринятое слово уже существует.

После foreach у меня возвращается false, потому что если он не может найти принятое слово (например, автомобиль), его следует отфильтровать.

Моя проблема в том, что это не работает. Кажется, он не нарушает функцию после того, как он входит в оператор if.

Как мне решить эту проблему?

Ответы [ 2 ]

1 голос
/ 09 марта 2012

Попробуйте это:

function checkFilter($arr)
{
$good=false;
$bad=false;

    $name = strtolower($arr['name']);
    $description = strtolower($arr['description']);

    $dbh = $this->connect();    
    $rs = $dbh->prepare("SELECT * FROM filter");
    $rs->execute();
    $all = $rs->fetchAll();

foreach ($all as $a)
  {
    if($a['value']==0)
      {
        if(strpos($name,$a['filter']!=='false') || strpos($description,$a['filter']!=='false') ){$good=true;}
      }
    if($a['value']==1)
      {
        if(strpos($name,$a['filter']!=='false') || strpos($description,$a['filter']!=='false') ){$bad=true;}
      }    
  }

return ($good && !$bad);
}
0 голосов
/ 09 марта 2012

Спасибо за ответ TecBrat.Я немного изменил ваш пример и заставил его работать.Теперь это выглядит так:

function checkFilter($arr)
{
    $name = strtolower($arr['name']);
    $description = strtolower($arr['description']);

    $dbh = $this->connect();    
    $rs = $dbh->prepare("SELECT * FROM filter");
    $rs->execute();
    $all = $rs->fetchAll();

    $bad = 3;
    $good = 3

    foreach ($all as $a)
    {
        if($a['value']==0)
        {
            if((strpos($name, strtolower($a['filter']))!==false) || (strpos($description, strtolower($a['filter']))!==false))
            {
                $bad = 0;
            }
        }

        if($a['value']==1)
        {   
            if((strpos($name, strtolower($a['filter']))!==false) || (strpos($description, strtolower($a['filter']))!==false) )
            {
                $good = 1;
            }
        }    
    }

    if($good == 1 && $bad != 0){
        return $good;
    }
    else
    {
        return $bad;
    }
}
...