2011-04-21 138 views
14

我正在PHP中使用一個非常小的在線商店應用程序。所以我有一個PHP中的地圖數組。我想在數組中搜索一個字符串(一個產品)。我查看了PHP中的array_search,它似乎只查找完全匹配。你們是否知道一個更好的方法來做這個功能?由於這只是我實際做的一小部分,所以我希望有內置的東西。任何想法?在PHP中搜索字符串或字符串的一部分

謝謝!

編輯:數組包含「產品」的格式如下:

[6] => SimpleXMLElement Object 
    (
     [@attributes] => Array 
      (
       [id] => 2000-YM 
      ) 

     [Name] => Team Swim School T-Shirt 
     [size] => YM 
     [price] => 15 
     [group] => Team Clothing 
     [id] => 2000-YM 
    ) 

[7] => SimpleXMLElement Object 
    (
     [@attributes] => Array 
      (
       [id] => 3000-YS 
      ) 

     [Name] => Youth Track Jacket 
     [size] => YS 
     [price] => 55 
     [group] => Team Clothing 
     [id] => 3000-YS 
    ) 

所以我想我可以做一個搜索,如「團隊」,它會回到我這裏看到的第一個項目。我將搜索的基礎放在名稱上(這又是一件小事)。我知道我可以找到確切的字符串,如果它找不到確切的項目,我只是堅持「最好的結果」。效率很好,但不是必需的,因爲我只有大約50件東西,所以即使我使用「慢」算法也不需要太多時間。

+1

您可能想要提供一旦正則表達式國王和皇后到達時所尋找的字符串。 – 2011-04-21 20:27:59

回答

31

array_filter允許您指定自定義功能來做搜索。你的情況,檢查使用strpos()一個簡單的功能,如果你的搜索字符串存在:

function my_search($haystack) { 
    $needle = 'value to search for'; 
    return(strpos($haystack, $needle)); // or stripos() if you want case-insensitive searching. 
} 

$matches = array_filter($your_array, 'my_search'); 

或者,您可以使用匿名函數,以幫助防止命名空間的污染:

$matches = array_filter($your_array, function ($haystack) use ($needle) { 
    return(strpos($haystack, $needle)); 
}); 
+5

如果你的'$ needle'是一個單獨的字符,就像我的情況一樣,如果位置索引爲0,則需要進行嚴格檢查(如果找不到匹配項,則爲'false'):'return(strpos($乾草堆,$針)!==假);' – 2012-11-05 19:48:06

+0

我想弄清楚$ haystack變量顯示在哪裏,是數組中的鍵? – 2017-12-21 16:25:19

0

你可以對每一個數組元素的用戶正則表達式像

foreach($array as $value) 
{ 
    //... your search statement for $value 
} 
6
foreach($array as $item){ 
    if(strpos($item,"mysearchword")!== false){ 
    echo 'found'; 
    } 
} 

,或者您可以使用的preg_match爲更靈活的搜索,而不是strpos。

+0

非常感謝。 – vanloc 2017-03-21 04:11:27

0

迭代整個數組,然後使用SUBSTR如果你想部分匹配:

http://php.net/manual/en/function.substr.php

這應該是足夠的,如果你有一個「小」店......

+0

'substr()'如名稱所示用於獲取子字符串。這對此有何幫助?你能舉一個例子嗎? – 2014-01-27 05:32:49

1

不幸的是,搜索是計算機科學中比較難做的事情之一。如果基於文字字符串匹配或正則表達式(正則表達式)構建搜索,則可能會發現您將不滿意返回結果的相關性。

如果你對捲起袖子感興趣,並且想要更復雜的解決方案,我會試試Zend的Lucene實現(http://framework.zend.com/manual/en/zend.search.lucene.html)。我已經使用它在網站上執行搜索。這花了幾天時間,但結果比15分鐘字面串匹配更好。

讓我知道你是否想要更多的信息。

祝你好運!

PS。這裏有一個例子:http://devzone.zend.com/article/91

1

我認爲馬克B的答案是一個很好的起點,但對我來說它有一些問題。比如你必須知道Needle是在「編譯時」,因爲你不能動態地改變這個值。如果針出現在字符串元素的開始處,它會表現得像它根本就不存在。所以經過一些小小的試驗之後,我想方設法解決這兩個問題。所以你不必爲每一根你想要使用的針頭創建一個新的功能。

function my_search($haystack) 
{ 
    global $needle; 
    if(strpos($haystack, $needle) === false) {return false;} else {return true;} 
} 

,它會被稱爲是這樣的:

$needle="item to search for"; 
$matches = array_filter($my_array, 'my_search'); 

並且是作爲針現在是在同一個範圍訪問的代碼的其餘部分可以設置針爲其他任何字符串變量,你包括用戶輸入。

-1

我有同樣的問題,但我已經創建我的函數來通過傳遞數組,搜索數組,鍵和值。

public function searchinarr($array, $key, $value) 
{ 
     $results = array(); 
      for($i=0;$i<count($array);$i++) 
      { 
       foreach($array[$i] as $k=>$val) 
       { 
        if($k==$key) 
        { 
         if(strpos($val,$value)!== false) 
         { 
          $results[] = $array[$i]; 
         } 
        } 
       } 

      } 
      return $results; 
}