2012-03-08 142 views
0

我有一个过滤功能,应该检查一个数组中的两个“字段”,这些是冷的名称描述过滤功能

我也有存储在数据库中的单词,其中过滤函数应该接受某些单词(true)并拒绝某些单词(false)。

例如: 应接受每一个帖子来包含单词

在其中接受了我已经存储在数据库下面的话: 汽车(显然)

不接受: 卡车 TRAKTOR 总线

所以我有一个应该去通过一个函数数组中的两个字段(名称描述)将它们与存储在数据库中的单词相匹配,并查看这些字段是包含接受的单词还是任何未接受的单词。

我的功能看起来像这样 $ ARR =传入阵列领域描述。 $ 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,并打破。这是因为如果接受的单词在名称说明如果未接受的单词已经存在,则无关紧要。

之后,我有一个返回false,因为如果它找不到接受的词(例如汽车),它应该被滤除。

我的问题是,这似乎并没有工作。在它进入if语句后,它似乎并没有打破这个功能。

我应该如何解决这个问题?

+0

如果存在接受或未接受的词否定另一个的效果。我的意思是,如果接受的不被接受的词都存在,会发生什么? – TecBrat 2012-03-08 15:38:41

+0

如果未被接受的话出现,则不应考虑接受的词。举个例子:“一辆蓝色的卡车正在开车”这里有车,但是因为卡车应该返回假。其他例子“一辆蓝色汽车正在驾驶”。这应该返回true。 – Fredrik 2012-03-08 15:41:42

+0

如果两者都不存在,会发生什么情况。 “一辆蓝色的福特正在驾驶” – TecBrat 2012-03-08 15:59:23

回答

1

试试这个:

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

如果我颠倒了你的好域和坏域,只需交换$ good = true和$ bad = true – TecBrat 2012-03-09 03:00:17

0

谢谢回答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; 
    } 
} 
+0

为什么你从布尔变换为整数? – TecBrat 2012-03-09 13:55:21