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

问题描述 投票:16回答:7

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

php arrays search store product
7个回答
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));
});

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

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


1
投票

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

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

如果您想了解更多信息,请告诉我。

祝你好运!

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


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

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


0
投票

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

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

0
投票

如果你想要部分匹配,遍历数组并使用substr:

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

如果你有一个“小”商店,这应该足够了......


-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;
}
© www.soinside.com 2019 - 2024. All rights reserved.