我有一个名为$data
的变量,它存储了大量数据。我知道数据会包含其中一个词...... cheese
,crackers
或fruit
。或者,它可能不包含这些单词。现在,我这样做......。
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次以查找每个项目?甚至可以将食物变量设置为找到的内容吗?
答案 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));
然后你可以根据结果影响食物。