php strpos在文本文件中缺少匹配项

php strpos在文本文件中缺少匹配项,php,strpos,Php,Strpos,我有一段代码在文本文件中搜索电子邮件地址,在同一行返回两个数字。 该文件看起来像: 24/08/2017,email@test.ie,1,2 21/05/2018,test@234.com,1,2 21/05/2018,test@test.ie,2,2 我的代码目前看起来像 $lines = file("log.txt"); $found = 0; foreach ($lines as $line){ if (strpos($line, $email) !==false

我有一段代码在文本文件中搜索电子邮件地址,在同一行返回两个数字。 该文件看起来像:

24/08/2017,email@test.ie,1,2
21/05/2018,test@234.com,1,2
21/05/2018,test@test.ie,2,2
我的代码目前看起来像

$lines = file("log.txt");
$found = 0;


foreach ($lines as $line){      
    if (strpos($line, $email) !==false){
        $found = true;

        $arrayOfLine = explode(",", $line);

        $foundGroup = $arrayOfLine[2]; 
        $foundVideo = $arrayOfLine[3]; 

    }
    elseif (strpos($line, $email) ===false){
        $found = false;
    }
}

当我运行这段代码时,通过一个HTML表单接收要搜索的电子邮件地址,它只会在最后输入的电子邮件中找到匹配的电子邮件-在我上面的示例中,test@234.com我不回火柴,但是test@test.ie将我错过了什么阻止它出现比赛

当您找到答案时,您并没有终止循环,这意味着即使找到了匹配项并覆盖了以前的任何匹配项,循环仍将继续运行。添加一个
break$foundGroup
$foundVideo
后的code>

您还有两个评估来检查相同的内容。在循环开始时,将
$found
标志设置为
false
。如果您的循环找不到匹配项,它仍然是false。你不需要两次比较

$found = false;

foreach ($lines as $line){      
    if (strpos($line, $email) !==false){
        $found = true;

        $arrayOfLine = explode(",", $line);

        $foundGroup = $arrayOfLine[2]; 
        $foundVideo = $arrayOfLine[3]; 
        break; // stop searching for more matches
    }
}

这其实很容易理解

它只会在最后输入的电子邮件中查找匹配的电子邮件

这是真的。为什么?因为您总是将
$found
设置为
false
,除非您搜索的电子邮件地址是最后一个。即使找到了匹配项,也只是继续循环并用
false
覆盖
$found

看一看,看看你能不能弄明白

您需要中断循环,或者停止以这种方式设置
$found

foreach ($lines as $line){      
    if (strpos($line, $email) !==false) {
        $found = true;

        $arrayOfLine = explode(",", $line);

        $foundGroup = $arrayOfLine[2]; 
        $foundVideo = $arrayOfLine[3]; 

    }
    elseif (strpos($line, $email) ===false) {
        $found = false; // This will be run every loop!
    }
}

我不知道你在用
$found
变量做什么,但是:@Mike这只是较大代码的一部分,总体目的是创建列表,但我不能有重复项,所以这部分搜索匹配项,如果找到匹配项,则会显示该电子邮件已存在于文件中。即使找到匹配项,此代码仍将继续搜索电子邮件地址,这是低效的。这正是我在回答中描述的。不确定你的意思。你的两个例子都有相同的错误。无论哪种方式,如果你的答案是让OP“弄明白”,那么我想你可以在stackoverflow上的每个答案上都写上。也许吧。OP的问题是我错过了什么,这阻止了它出现比赛?这就是我解释的。虽然没有给出一段工作代码,这是真的。