PHP - 搜索大字符串比使用多个IF有更好的方法吗?

时间:2017-09-18 14:18:09

标签: php string variables if-statement search

我有一个名为$data的变量,它存储了大量数据。我知道数据会包含其中一个词...... cheesecrackersfruit。或者,它可能不包含这些单词。现在,我这样做......。

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次以查找每个项目?甚至可以将食物变量设置为找到的内容吗?

5 个答案:

答案 0 :(得分:3)

为什么你没有使用数组呢?这会更容易

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

这更简单。不一定更快。

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

答案 3 :(得分:0)

这结果是一个有趣的实验。我使用IF语句对原始方法进行了一些计时测试,然后使用Jammy和Jason发布的数组方法,然后使用Daren发布的preg_match方法。我很惊讶。无论您使用何种方法,PHP都是超级快速的。我创建了一个名为$ data的变量,其长度为1meg,并且可以为10个单词中的任意一个进行搜索。当没有找到任何单词时我平均得到了这个......

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

所以,即使在循环遍历所有数据10次之后,IF和数组循环至少比preg匹配快10倍,但Pregmatch仍然会在你能够闪烁之前完成。

答案 4 :(得分:-1)

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

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

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