2014-02-24 27 views
0

我試圖找出一個方法,如果用戶輸入搜索項涉及$propertyData陣列中的任何一部分內。查找,如果用戶搜索任何陣列領域

到目前爲止,我已經使用in_array()功能,但我的理解,如果用戶輸入搜索項陣列場完全匹配例如它只會匹配用戶輸入「這是一所房子」,它與數組中的第一個字段匹配,即「This is a house」,但如果用戶輸入「This is a」或「house」,它將不匹配,即使這些字詞存在在那個領域。

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

是否有可用於實現任務的功能/方式?

回答

2

嘗試preg_grep()。它通過正則表達式搜索數組,並返回與表達式匹配的值數組。所以,如果返回不是空數組以外的任何其他它被認爲是正確的:

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

對於不區分大小寫加i修改:

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

如果你想所有匹配值的數組(如果超過1)也,則:

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

有沒有把戲,你能請詳細說明這裏發生了什麼? – Ilja

+0

@IJAJ:增加了一些說明。 – AbraCadaver

1

使用array_filter()結合strpos()掃描陣列的搜索字符串的部分比賽和在那裏找到一個匹配的回報項目:

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

或者,你可以使用preg_grep()在AbraCadaver的答案建議。它返回一個數組,其中包含與給定模式匹配的輸入數組元素。正則表達式需要包含在分隔符中。我用下面/

// escape search pattern to allow for special characters 
$searchPattern = preg_quote($getSearch, '/'); 

if ($arr = preg_grep("/$searchPattern/", $propertyData)) { 
    print_r($arr); 
    // ... 
} 
+0

我假設'preg_grep()'是野生動物解決方案中最快的。 +1也許會有一次做基準,比較這個..但是,現在我看到沒有人提出數據庫到目前爲止..如果數據增長這可能是最後的最快嘗試.. – hek2mgl

1

您可以使用這樣的事情:

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

但是,如果$propertyData增長,該解決方案將得到緩慢。然後你可以使用一個數據庫。

0

使用:

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