【问题标题】:Find if user search is within a part of any array fields查找用户搜索是否在任何数组字段的一部分内
【发布时间】:2014-02-24 18:23:25
【问题描述】:

我正在尝试找出一种方法来查看用户输入的搜索词是否与 $propertyData 数组中的任何内容相关。

到目前为止,我已经使用了in_array() 函数,但据我了解,只有当用户输入的搜索词与数组字段完全匹配时,它才会匹配,例如用户输入“这是一栋房子”,它匹配数组中的第一个字段,即“这是一栋房子”,但如果用户输入“这是一栋”或“一栋房子”,即使这些词存在,它也不会匹配在那个领域。

if(in_array($getSearch, $propertyData)) {
   // $getSearch is user input
   // $propertyData is array containing fields
}

有没有可以用来完成任务的功能/方式?

【问题讨论】:

    标签: php arrays string search


    【解决方案1】:

    试试preg_grep()。它通过正则表达式搜索数组并返回与表达式匹配的值数组。因此,如果返回空数组以外的任何内容,则将其视为 true:

    if(preg_grep("/$getSearch/", $propertyData)) {
    

    如果不区分大小写,请添加i 修饰符:

    if(preg_grep("/$getSearch/i", $propertyData)) {
    

    如果您还想要一个包含所有匹配值(如果超过 1)的数组,那么:

    if($matches = preg_grep("/$getSearch/i", $propertyData)) {
    

    【讨论】:

    • 成功了,您能否详细说明这里到底发生了什么?
    • @Ilja:添加了一点描述。
    【解决方案2】:

    结合使用array_filter() 和strpos() 扫描您的数组以查找搜索字符串的部分匹配项并返回找到匹配项的项:

    $result = array_filter($array, 
        function ($item) use ($getSearch) {
            return (strpos($item, $getSearch) !== FALSE);
        },
    $propertyData);
    

    或者,您可以按照 AbraCadaver 的回答中的建议使用 preg_grep()。它返回一个数组,该数组由与给定模式匹配的输入数组的元素组成。正则表达式需要包含在分隔符中。我在下面使用了/:

    // escape search pattern to allow for special characters
    $searchPattern = preg_quote($getSearch, '/');
    
    if ($arr = preg_grep("/$searchPattern/", $propertyData)) {
        print_r($arr);
        // ...
    }
    

    【讨论】:

    • 我认为preg_grep() 是野生动物解决方案中最快的。 +1 也许会做一个基准,比较一下。但是,现在我看到到目前为止没有人建议数据库。如果数据增长,这可能是最后最快的尝试。
    【解决方案3】:

    你可以这样使用:

    $found = FALSE;
    foreach($propertyData as $property) {
        if(strpos($userQuery, $property)) {
            $found = TRUE;
            break;
        }
    }
    

    但是,如果$propertyData 增长,此解决方案将变慢。然后你可以为此使用数据库。

    【讨论】:

      【解决方案4】:

      用途:

      foreach($propertyData as $data )
      {
          if( strpos($data, $getSearch) )
          {
              //match found
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-16
        • 2014-07-25
        • 2023-02-10
        • 1970-01-01
        • 2016-10-13
        • 2018-09-01
        • 2020-04-27
        相关资源
        最近更新 更多