在PHP中搜索字符串或字符串的一部分

时间:2011-04-21 20:25:19

标签: php arrays search store product

我正在用PHP做一个非常小的在线商店应用程序。所以我在PHP中有一组地图。我想在数组中搜索字符串(产品)。我在PHP中查看了array_search,似乎只查找完全匹配。你们知道更好的方法来实现这个功能吗?由于这只是我实际做的一小部分,所以我希望内置一些东西。有什么想法吗?

谢谢!

编辑:该数组包含以下格式的“产品”:

[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项,所以即使我使用“慢”算法也不会花费太多时间。

7 个答案:

答案 0 :(得分:39)

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

答案 1 :(得分:8)

foreach($array as $item){
  if(strpos($item,"mysearchword")!== false){
    echo 'found';
  }
}

或者您可以使用preg_match进行更灵活的搜索,而不是使用strpos。

答案 2 :(得分:1)

不幸的是,搜索是计算机科学中最难处理的事情之一。如果您基于文字字符串匹配或正则表达式(正则表达式)构建搜索,您可能会发现您对返回的结果的相关性不满意。

如果你有兴趣卷起袖子并使用更复杂的解决方案变得有点脏,我会尝试Zend的Lucene实现(http://framework.zend.com/manual/en/zend.search.lucene.html)。我用它在网站上实现了搜索。花了几天时间,但结果比文字字符串匹配的15分钟解决方案好很多。

如果您想了解更多信息,请与我们联系。

祝你好运!

PS。这是一个例子:http://devzone.zend.com/article/91

答案 3 :(得分:1)

我认为Marc 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');

现在可以在与其余代码相同的范围内访问针,您可以将针设置为您想要的任何其他字符串变量,包括用户输入。

答案 4 :(得分:0)

您可以在每个数组元素上使用正则表达式,例如

foreach($array as $value)
{
    //... your search statement for $value
}

答案 5 :(得分:0)

如果你想要部分匹配,

遍历数组并使用substr:

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

如果你有一个“小”商店,那就足够了......

答案 6 :(得分:-1)

我有相同的问题,但我创建了i函数,通过传递数组,键和值来搜索数组。

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;
}