【问题标题】:Search for a string or part of string in PHP在 PHP 中搜索字符串或字符串的一部分
【发布时间】:2011-08-10 14:27:04
【问题描述】:

我正在用 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


【解决方案1】:

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

【讨论】:

  • 如果您的 $needle 是像我这样的单个字符,您需要进行严格检查以防位置索引为 0(如果未找到匹配项,则为 false): return(strpos($haystack, $needle) !== false);
  • 我试图找出 $haystack 变量出现在哪里,是数组中的那个键吗?
【解决方案2】:
foreach($array as $item){
  if(strpos($item,"mysearchword")!== false){
    echo 'found';
  }
}

或者您可以使用 preg_match 代替 strpos 进行更灵活的搜索。

【讨论】:

  • 我有同样的问题,但我有搜索字符串数组。如何检查文件中是否存在任何搜索字符串。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

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

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

    祝你好运!

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

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

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

        【讨论】:

        • substr() 顾名思义用于获取子字符串。这对这里有什么帮助?你能举个例子吗?
        【解决方案7】:

        我有同样的问题,但我创建了 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;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-07-23
          • 1970-01-01
          • 2012-08-16
          • 2012-07-16
          • 1970-01-01
          • 2023-02-02
          • 2016-12-08
          相关资源
          最近更新 更多