PHP-有没有比使用多个IFs更好的方法来搜索大字符串

PHP-有没有比使用多个IFs更好的方法来搜索大字符串,php,string,variables,if-statement,search,Php,String,Variables,If Statement,Search,我有一个名为$data的变量,它存储了大量数据。我知道数据将包含以下词语之一……奶酪,饼干,或水果。或者,它可能不包含这些词。现在,我做这个 if (strpos($data,"cheese")!==false) $food="cheese"; else if (strpos($data,"crackers")!==false) $food="crackers"; else if (strpos($data,"fruit")!==false) $food="fruit"; else $food=

我有一个名为
$data
的变量,它存储了大量数据。我知道数据将包含以下词语之一……
奶酪
饼干
,或
水果
。或者,它可能不包含这些词。现在,我做这个

if (strpos($data,"cheese")!==false) $food="cheese";
else if (strpos($data,"crackers")!==false) $food="crackers";
else if (strpos($data,"fruit")!==false) $food="fruit";
else $food=”none”;
因此,如果找到奶酪,数据只会被搜索一次。如果没有找到奶酪,数据将再次被搜索,因为它首先查找奶酪,但没有找到,然后必须再次搜索以查找饼干。看到问题了吗?因此,如果没有找到食物,在最终设置食物变量之前,数据会被搜索3次(我说的对吗,它是这样工作的?)

我想知道是否有更有效的搜索方法。我想了一个可能的方法,但我不知道怎么做… 如果我像这样同时搜索三种食物会怎么样

if (strpos($data,"cheese")!==false or
strpos($data,"crackers")!==false or
strpos($data,"fruit")!==false)
$food=THE WORD THAT WAS FOUND GOES HERE

我希望能够将食物变量设置为找到的食物。如果这是可能的,我是否认为这会更快,因为您只搜索了一次数据?还是PHP仍在搜索3次以查找每个项目?甚至可以将food变量设置为找到的食物吗?

为什么不使用数组呢?那会容易些

$words = ["cheese","crackers","fruit"];
$food = null;
foreach ($words as $value){
    if (!$food && strpos($data, $value))
        $food = $value;
}

为什么不使用数组呢?那会容易些

$words = ["cheese","crackers","fruit"];
$food = null;
foreach ($words as $value){
    if (!$food && strpos($data, $value))
        $food = $value;
}

最好的方法可能是使用数组:

$data = "cheese platter";
$toCheck = [
    "fruit",
    "crackers",
    "cheese"
];
$food = false;
foreach ($toCheck as $item){
    if (strpos($data, $item) !== false) {
        $food = $value;
        break;
    }
}`

最好的方法可能是使用数组:

$data = "cheese platter";
$toCheck = [
    "fruit",
    "crackers",
    "cheese"
];
$food = false;
foreach ($toCheck as $item){
    if (strpos($data, $item) !== false) {
        $food = $value;
        break;
    }
}`

这将为您提供单词的所有位置

$data = explode(' ', $data); 
$words= array('cheese', 'fruit', 'crackers');
var_dump(array_intersect($data, $words)); 

然后你可以根据结果影响食物。

这将给出单词的所有位置

$data = explode(' ', $data); 
$words= array('cheese', 'fruit', 'crackers');
var_dump(array_intersect($data, $words)); 

然后你可以根据结果影响食物。

这更简单。不一定快

$food = 'none';
if (preg_match('#(cheese|crackers|fruit)#', $data, $match)) {
    $food = $match[1];
}

这更简单。不一定快

$food = 'none';
if (preg_match('#(cheese|crackers|fruit)#', $data, $match)) {
    $food = $match[1];
}

这是一个有趣的实验。我使用IF语句对我的原始方法进行了一些计时测试,然后使用Jammy和Jason发布的array方法,然后使用Daren发布的preg_match方法。我很惊讶。无论使用什么方法,PHP都是超级快速的。我创建了一个名为$data的变量,该变量的长度为1mg,可以搜索10个单词中的任意一个。当找不到单词时,我平均时间得到这个

If_method = 0.01 seconds
Array_Method = 0.006 seconds
Preg_match = 0.1 seconds

因此,即使将所有数据循环10次,IFs和数组循环的速度至少比preg match快10倍,但preg match仍将在您闪烁之前完成

这是一个有趣的实验。我使用IF语句对我的原始方法进行了一些计时测试,然后使用Jammy和Jason发布的array方法,然后使用Daren发布的preg_match方法。我很惊讶。无论使用什么方法,PHP都是超级快速的。我创建了一个名为$data的变量,该变量的长度为1mg,可以搜索10个单词中的任意一个。当找不到单词时,我平均时间得到这个

If_method = 0.01 seconds
Array_Method = 0.006 seconds
Preg_match = 0.1 seconds


因此,即使将所有数据循环10次,IFs和数组循环的速度至少比preg match快10倍,但preg match仍将在您闪烁之前完成

$data
是否只包含单词,还是也包含其他单词?您的第二种方法实际上与第一种方法相同,因为它仍然调用
strpos()
三次。你是否认为做三次实际上是个问题?速度明显慢吗?如果没有,微优化很少值得费心。你可以尝试使用
preg_match()
和一个匹配项,例如
(奶酪、饼干、水果)
,然后检查实际匹配的内容;但是我不相信它会更快。是
$data
只包含单词,还是也包含其他单词?您的第二种方法实际上与第一种方法相同,因为它仍然调用
strpos()
三次。你是否认为做三次实际上是个问题?速度明显慢吗?如果没有,微优化很少值得费心。你可以尝试使用
preg_match()
和一个匹配项,例如
(奶酪、饼干、水果)
,然后检查实际匹配的内容;但我不相信它会更快。快一点,尽管这可能不是真的更快,只是更具活力。微优化很少值得去做,但我认为你的答案是一个比我想要的更好的解决方案。这会减少数据的搜索次数吗?以目前的方式编写,这不会减少数据的搜索次数,我给出了一个非常类似的答案,但包含了一个中断,因此一旦找到搜索字符串,数据变量就不再被选中,请告诉我,尽管这可能不会更快,更具活力。微优化很少值得去做,但我认为你的答案是一个比我想要的更好的解决方案。这会减少数据的搜索次数吗?按照目前的方式,这不会减少数据的搜索次数,我给出了一个非常类似的答案,但有一个中断,因此,一旦搜索字符串被找到,数据变量就不再被检查了。你怎么知道单词是由空格分隔的呢?他的数据是一个字符串,我在这里做了一个分隔符“”,他可以选择他拥有的任何分隔符。我知道你得到的是什么,但根据给定的信息,它无法证明格式,但举例来说,列表有如果是“葡萄柚”的话,那就不会是一种水果,也不会是一个问题,或者如果格式类似于“苹果水果”“这行不通,你怎么知道单词是用空格分隔的呢?他的数据是一个字符串,我在这里做了一个分隔符“”,他可以选择他拥有的任何分隔符。我明白你的意思,但根据给出的信息,无法证明格式,但举例来说,列表中有“葡萄柚”在它里面,这将不是一个水果,这可能是一个问题,或者如果格式是类似于“苹果水果”的东西,它不会为休息投票