Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中搜索字符串或字符串的一部分_Php_Arrays_Search_Store_Product - Fatal编程技术网

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

在PHP中搜索字符串或字符串的一部分,php,arrays,search,store,product,Php,Arrays,Search,Store,Product,我正在用PHP做一个非常小的在线商店应用程序。所以我有一个PHP中的映射数组。我想在数组中搜索字符串(产品)。我在PHP中查看了array_search,它似乎只查找精确匹配。你们知道更好的方法来实现这个功能吗?因为这只是我实际工作的一小部分,所以我希望里面有一些东西。有什么想法吗 谢谢 编辑:数组包含以下格式的“产品”: [6] => SimpleXMLElement Object ( [@attributes] => Array (

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

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

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(vs
false
如果没有找到匹配项):
返回(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;
}