在PHP中搜索字符串或字符串的一部分
我正在用PHP做一个非常小的在线商店应用程序。所以我有一个PHP中的映射数组。我想在数组中搜索字符串(产品)。我在PHP中查看了array_search,它似乎只查找精确匹配。你们知道更好的方法来实现这个功能吗?因为这只是我实际工作的一小部分,所以我希望里面有一些东西。有什么想法吗 谢谢 编辑:数组包含以下格式的“产品”:在PHP中搜索字符串或字符串的一部分,php,arrays,search,store,product,Php,Arrays,Search,Store,Product,我正在用PHP做一个非常小的在线商店应用程序。所以我有一个PHP中的映射数组。我想在数组中搜索字符串(产品)。我在PHP中查看了array_search,它似乎只查找精确匹配。你们知道更好的方法来实现这个功能吗?因为这只是我实际工作的一小部分,所以我希望里面有一些东西。有什么想法吗 谢谢 编辑:数组包含以下格式的“产品”: [6] => SimpleXMLElement Object ( [@attributes] => Array (
[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个项目,所以即使我使用“慢”算法,也不会花费太多时间 您可以在每个数组元素上使用正则表达式,如
foreach($array as $value)
{
//... your search statement for $value
}
或者,您可以使用preg_match来进行更灵活的搜索,而不是strop。如果需要部分匹配,请迭代数组并使用substr:
如果您有一个“小型”存储,这就足够了。
array\u 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));
});
不幸的是,搜索是计算机科学中比较困难的事情之一。如果您构建基于文本字符串匹配或正则表达式(regex)的搜索,您可能会发现对返回结果的相关性不满意 如果您想卷起袖子,用更复杂的解决方案弄脏一点,我会试试Zend的Lucene实现()。我用它在一个网站上进行了搜索。这花了几天时间,但结果比15分钟的文字字符串匹配解决方案要好得多 如果您想了解更多信息,请告诉我 祝你好运
注:这里有一个例子:我认为Marc B的答案是一个很好的起点,但对我来说,它有一些问题。例如,您必须知道“编译时”的指针是什么,因为您不能动态更改该值。另外,如果指针出现在字符串元素的开头,它会表现为根本不存在。所以经过一点实验后,我设法找到了解决这两个问题的方法。所以你不必为你想用的每一根不同的针都创建一个新的功能
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');
现在可以在与代码其余部分相同的范围内访问指针,您可以将指针设置为所需的任何其他字符串变量,包括用户输入。我也有同样的问题,但我创建了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;
}
公共函数searchinar($array,$key,$value)
{
$results=array();
对于($i=0;$i$val)
{
如果($k==$key)
{
if(strpos($val,$value)!==false)
{
$results[]=$array[$i];
}
}
}
}
返回$results;
}
一旦regex kings和queen到达,您可能需要提供您要查找的字符串。如果您的$pinder
是一个单字符,就像我的例子一样,您需要进行严格检查,以防位置索引为0(vsfalse
如果没有找到匹配项):返回(strpos($haystack,$pinder)!=false)
我试图找出$haystack变量出现的位置,它是数组中的键吗?substr()
如名称所示,用于获取子字符串。这对这里有什么帮助?你能用一个例子来演示吗?我有同样的问题,但我有一个搜索字符串数组。如何检查文件中是否存在任何搜索字符串。
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;
}