查找用户搜索是否在任何数组字段的一部分内

时间:2014-02-24 18:23:25

标签: php arrays string search

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

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

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

是否有可用于实现任务的功能/方式?

4 个答案:

答案 0 :(得分:2)

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

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

对于不区分大小写的情况,请添加i修饰符:

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

如果你想要一个匹配的所有值的数组(如果大于1),那么:

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

答案 1 :(得分:1)

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);
    // ...
}

答案 2 :(得分:1)

您可以使用以下内容:

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

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

答案 3 :(得分:0)

使用:

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