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