2011-04-21 141 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; 
}