【问题标题】:Filter function过滤功能
【发布时间】:2012-03-26 02:06:16
【问题描述】:

我有一个过滤器函数,它应该检查数组中的两个“字段”,它们是冷的 namedescription

我也有存储在数据库中的词,过滤器功能应该接受某些词(真)并拒绝某些词(假)。

示例: 每个包含 car 字样的帖子都应该被接受。

在数据库中,我存储了以下被接受的单词: 汽车(显然)

不接受: 卡车 拖拉机 公交车

所以我有一个函数应该通过数组中的两个字段(namedescription)将它们与存储在数据库中的单词匹配并查看如果字段包含接受的词或任何不接受的词。

我的函数看起来像这样 $arr = 带有字段 namedescription 的传入数组。 $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 并中断。这是因为接受的词是否在 namedescription 中都没有关系,如果不接受的词已经存在。

在 foreach 之后我有一个 return false 因为如果它找不到接受的单词(例如 car)它应该被过滤掉。

我的问题是这似乎不起作用。在进入 if 语句后,它似乎并没有破坏函数。

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

【问题讨论】:

  • 如果一个被接受或未被接受的词的存在否定另一个的影响。我的意思是,如果两个接受的不接受的词都存在,会发生什么?
  • 如果出现不接受的词,则不应考虑接受的词。例如:“一辆蓝色卡车正在行驶”这里有车,但因为卡车在,所以它应该返回 false。其他示例“一辆蓝色汽车正在行驶”。这应该返回 true。
  • 如果两者都不存在会发生什么。 “一辆蓝色福特正在驾驶”
  • 然后 - 我的想法是 - 它应该返回 false。您在 foreach 之外看到最后一个返回 false。
  • 我试图先用英语理解问题,然后再用代码理解。看起来你需要的逻辑是if (good && !bad){return true;}else{return false;} 这样对吗?

标签: php function filter return break


【解决方案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);
}

【讨论】:

  • 如果我颠倒了你的好和坏字段,只需交换 $good=true 和 $bad=true
【解决方案2】:

感谢 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;
    }
}

【讨论】:

  • 你为什么从布尔值切换到整数?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-10
  • 2016-08-27
  • 2019-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多